管道的作用- 兩個進程間傳遞消息
from multiprocessing import Pipe, Process
def func(conn1,conn2):
conn2.close() #子進程只需使用connection1,故關閉connection2
while True:
try:
msg = conn1.recv()
print(msg)
except EOFError: #沒收數據接收的時候,才拋出的異常
conn1.close()
break
if __name__ == '__main__':
conn1,conn2 = Pipe()#建立一個管道,管道返回兩個connection
Process(target=func, args=(conn1,conn2)).start()
conn1.close() #主進程只需要一個connection,故關閉一個
for i in range(20):
conn2.send('吃了嗎') #主進程發送
conn2.close() #主進程關閉connection2
管道是進程數據不安全的
- pipe有數據不安全性 - 多個消費者同時取一個數據的情況可能發送
- 通過IPC通訊
- 解決方法 -加鎖
- 隊列是進程數據安全的-隊列是基於管道加鎖
from multiprocessing import Process,Pipe,Lock
def consumer(p,name,lock):
produce, consume=p
produce.close()
while True:
lock.acquire()
baozi=consume.recv()
lock.release()
if baozi:
print('%s 收到包子:%s' %(name,baozi))
else:
consume.close()
break
def producer(p,n):
produce, consume=p
consume.close()
for i in range(n):
produce.send(i)
produce.send(None)
produce.send(None)
produce.close()
if __name__ == '__main__':
produce,consume=Pipe()
lock = Lock()
c1=Process(target=consumer,args=((produce,consume),'c1',lock))
c2=Process(target=consumer,args=((produce,consume),'c2',lock))
p1=Process(target=producer,args=((produce,consume),10))
c1.start()
c2.start()
p1.start()
produce.close()
consume.close()
c1.join()
c2.join()
p1.join()
print('主進程')