python 管道,程序間的資料共享

2022-08-26 11:24:13 字數 1802 閱讀 3064

一. 管道

管道傳輸資料是不安全的,佇列是安全的

匯入管道 : 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

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 import

manager,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...