管道是雙向通信的,資料從其中一端傳入,就會從另外一端傳出。
from multiprocessing import Pipe
c1, c2 = Pipe()
c1.send(123)
print(c2.recv()) # 一端進去,從另一端接收。
在程序間通過管道實作通信。
from multiprocessing import Pipe
from multiprocessing import Process
def func(conn):
conn.send(111)
if __name__ == "__main__":
conn1, conn2 = Pipe()
p = Process(target=func, args=(conn1,))
p.start()
print(conn2.recv())
多次發資料:
from multiprocessing import Process
from multiprocessing import Pipe
def func(conn):
while 1:
msg = conn.recv()
if msg == None:break
print(msg)
if __name__ == "__main__":
conn1, conn2 = Pipe()
Process(target=func, args=(conn1,)).start()
for i in range(20):
conn2.send(111)
conn2.send(None)
另一種方式close():
from multiprocessing import Process
from multiprocessing import Pipe
def func(conn1, conn2):
conn2.close() # conn2傳過來不用,直接關掉
while 1:
try:
msg = conn1.recv()
print(msg)
except EOFError: # 捕獲這個報錯,關掉conn1并結束.EOFError是沒有資料了還要recv時報的錯
conn1.close()
break
if __name__ == "__main__":
conn1, conn2 = Pipe()
Process(target=func, args=(conn1, conn2)).start()
conn1.close() # 關掉conn1
for i in range(20):
conn2.send(111)
conn2.close() # 關掉conn2