一. 管道
管道傳輸數據是不安全的,隊列是安全的
導入管道 : 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