一. 管道
管道傳輸資料是不安全的,佇列是安全的
匯入管道 : 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 importprocess,pipe
deffunc(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 importmanager,process
defmain(num):
num['w
'] -= 1
print(num)#
結果: 9
if__name__ == '
__main__':
m =manager()
num = m.dict()#
p = process(target=main, args=(num,))
p.start()
p.join()
print(num)#
結果: 9
程序間的管道通訊
管道是程序間通訊的一種工具。1 管道是半雙工的,建立管道後,只能由乙個程序向另乙個程序傳資料。2 管道只能在有公共祖先的兩個程序之間使用。父程序建立管道後,fork,這個管道就能在父子程序之間呼叫了。管道通過pipe函式建立。pipe int fd 2 要開啟兩個檔案,檔案描述符放在fd裡面。寫資料...
Python程序間通訊之匿名管道
管道是乙個單向通道,有點類似共享記憶體快取.管道有兩端,包括輸入端和輸出端.對於乙個程序的而言,它只能看到管道一端,即要麼是輸入端要麼是輸出端.os.pipe 返回2個檔案描述符 r,w 表示可讀的和可寫的.示例 如下 usr bin python import time import os def...
Python程序間通訊之匿名管道
管道是乙個單向通道,有點類似共享記憶體快取.管道有兩端,包括輸入端和輸出端.對於乙個程序的而言,它只能看到管道一端,即要麼是輸入端要麼是輸出端.os.pipe 返回2個檔案描述符 r,w 表示可讀的和可寫的.示例 如下 usr bin python import time import os def...