python 管道,進程間的數據共享


一. 管道

  管道傳輸數據是不安全的,隊列是安全的

  導入管道 : from multiprocessing import Pipe

   創建管道 : Pipe( duplex) 在進程之間創建一條管道,並返回元組( conn1,conn2),其中conn1,conn2表示管道兩端的連接對象. 管道的創建必須在Process對象之前. ( duplex : 默認管道是全雙工的,如果將duplex設成False,conn1只能用於接收,conn2只能用於發送)

  接收方法 : conn1.recv() : 接收conn2.send(obj)發送的對象. 如果沒有消息可接收,recv方法會一直阻塞. 如果連接的另外一段已經關閉,recv方法會拋出異常 : EOFError.

  EOFError異常 : 管道中著名的異常,就是,父進程關閉了發送端,子進程還在等待繼續接收數據.

  conn1.send(obj) : 通過連接發送對象. obj是與序列化兼容的任意對象.

from multiprocessing import Process,Pipe

def func(con):
    c1,c2 = con
    c1.close()#主進程用conn1發送數據,子進程要用對應的conn2接受,所以講conn1關閉,不關閉程序會阻塞
    while 1:
        try:#異常處理,出現異常退出
            print(c2.recv())#將conn2接受的數據打印
        except:#說明素有數據已經全部接受,進程會拋出異常
            break

if __name__ == '__main__':
    conn1,conn2 = Pipe()#開啟管道
    p = Process(target=func, args=((conn1,conn2),))#將管道的兩個返回值以元組形式傳給子進程
    p.start()
    conn2.close()#用conn1發送數據,conn2不用,將其關閉
    for i in range(10):
        conn1.send(i)
    conn1.close()#發送完數據后,將conn1關閉

  如果單進程使用管道 : conn1發數據,conn2接受數據. conn2發數據,conn1接受數據.

  如果多進程使用管道 : 父進程conn1發數據,子進程conn2接收數據.

            父進程conn2發數據,子進程conn1接收數據.

            父進程conn1接收數據,子進程conn2發數據.

            父進程conn2接收數據,子進程conn1發數據.

  

二. 數據共享

  進程間的數據是獨立的,可以借助隊列或者管道實現通信,二者都是基於消息傳遞的

  雖然進程間的數據獨立,但可以通過Manager實現數據共享,事實上Mansger的功能還有很多.

from multiprocessing import Manager,Process

def main(num):
    num['w'] -= 1
    print(num)#結果: 9

if __name__ == '__main__':
    m = Manager()
    num = m.dict({'w':10})#
    p = Process(target=main, args=(num,))
    p.start()
    p.join()
    print(num)#結果: 9

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM