1. <em id="yud1w"><acronym id="yud1w"><u id="yud1w"></u></acronym></em>
      
      
      <button id="yud1w"></button>

      python

      當前位置:首頁?>?python并發編程?>?當前文章

      python并發編程

      進程間的通信Pipe管道

      2019-06-06 66贊 老董筆記
      每篇文章努力于解決一個問題!更多精品可移步文章底部。

        管道的本質是在內存中開辟一個新的空間,對多個進程可見,在通信形式上形成一種約束,管道在信息傳輸上是以流的方式傳輸,先進先出原則。

        需要程序調用 multiprocessing.Pipe(duplex) 來創建一個管道。該函數會返回兩個 PipeConnection 對象,代表管道的兩個連接端(一個管道有兩個連接端,分別用于連接通信的兩個進程)。

        1) 如果duplex為True(默認),則管道是雙向的(即每個端同時可以收發信息)

        2) 如果duplex是False,那么管道是單向的:conn1只能用于接收消息,conn2只能用于發送消息。

        3) 默認情況下是雙工(雙向,即一端可以發消息同時可以收消息)

        PipeConnection 對象包含如下常用方法:

        send(obj):發送一個 obj 給管道的另一端,另一端使用 recv() 方法接收。需要說明的是,該 obj 必須是可 picklable 的(Python 的序列化機制),如果該對象序列化之后超過 32MB,則很可能會引發 ValueError 異常。

        recv():接收另一端通過 send() 方法發送過來的數據。

        fileno():關于連接所使用的文件描述器。

        close():關閉連接。

        poll([timeout]):返回連接中是否還有數據可以讀取。

        send_bytes(buffer[, offset[, size]]):發送字節數據。如果沒有指定 offset、size 參數,則默認發送 buffer 字節串的全部數據;如果指定了 offset 和 size 參數,則只發送 buffer 字節串中從 offset 開始、長度為 size 的字節數據。通過該方法發送的數據,應該使用 recv_bytes() 或 recv_bytes_into 方法接收。

        recv_bytes([maxlength]):接收通過 send_bytes() 方法發迭的數據,maxlength 指定最多接收的字節數。該方法返回接收到的字節數據。

        recv_bytes_into(buffer[, offset]):功能與 recv_bytes() 方法類似,只是該方法將接收到的數據放在 buffer 中。

        注意點:

        如果兩個進程(或線程)嘗試同時讀取或寫入管道的同一端,管道中的數據可能會損壞,在實現生產者消費者模型中需要加鎖。其實管道加鎖就是隊列的實現!

      # ‐*‐ coding: utf‐8 ‐*‐
      
      import multiprocessing
      from multiprocessing import Process, Pipe
      
      
      def proc1(pipe):
      
          pipe.send("proc1")
          print("進程proc1({0})收到".format(multiprocessing.current_process()),pipe.recv())
      
      def proc2(pipe):
      
          print("進程proc2({0})收到".format(multiprocessing.current_process()),pipe.recv())
          pipe.send("proc2")
      
      
      if __name__ == '__main__':
      
          # 創建一個管道 這個管道是雙向的
          pipe = Pipe()
      
          # pipe[0] 表示管道的一端,pipe[1] 表示管道的另外一端
          p1 = Process(target=proc1,args=(pipe[0],))
          p2 = Process(target=proc2,args=(pipe[1],))
          p1.start()
          p2.start()
          p1.join()
          p2.join()
      
      D:installpython3python.exe D:/pyscript/test/test1.py
      進程proc2(<Process(Process-2, started)>)收到 proc1
      進程proc1(<Process(Process-1, started)>)收到 proc2
      
      Process finished with exit code 0
      
      

      文章評論

      進程間的通信Pipe管道文章寫得不錯,值得贊賞
      国产99视频精品免视看6