Python——管道通信
管道:双向通信 2个进程之间相互通信
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from multiprocessing import Pipe,Process 2 3 def func(conn1,conn2): 4 conn2.close() 5 while True: 6 try : 7 msg = conn1.recv() 8 print(msg) 9 except EOFError: #抛出无数据时异常 10 conn1.close() 11 break 12 13 if __name__ == '__main__': 14 conn1, conn2 = Pipe() 15 Process(target=func,args = (conn1,conn2)).start() 16 conn1.close() 17 for i in range(20): 18 conn2.send('吃了么') 19 conn2.close()
利用管道解决消费者模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from multiprocessing import Lock,Pipe,Process 2 def producer(con,pro,name,food): 3 con.close() 4 for i in range(100): 5 f = '%s生产%s%s'%(name,food,i) 6 print(f) 7 pro.send(f) 8 pro.send(None) 9 pro.send(None) 10 pro.send(None) 11 pro.close() 12 13 def consumer(con,pro,name,lock): 14 pro.close() 15 while True: 16 lock.acquire() 17 food = con.recv() 18 lock.release() 19 if food is None: 20 con.close() 21 break 22 print('%s吃了%s' % (name, food)) 23 if __name__ == '__main__': 24 con,pro = Pipe() 25 lock= Lock() 26 p = Process(target=producer,args=(con,pro,'egon','泔水')) 27 c1 = Process(target=consumer, args=(con, pro, 'alex',lock)) 28 c2 = Process(target=consumer, args=(con, pro, 'bossjin',lock)) 29 c3 = Process(target=consumer, args=(con, pro, 'wusir',lock)) 30 c1.start() 31 c2.start() 32 c3.start() 33 p.start() 34 con.close() 35 pro.close() 36 37 from multiprocessing import Process,Pipe,Lock 38 39 def consumer(produce, consume,name,lock): 40 produce.close() 41 while True: 42 lock.acquire() 43 baozi=consume.recv() 44 lock.release() 45 if baozi: 46 print('%s 收到包子:%s' %(name,baozi)) 47 else: 48 consume.close() 49 break 50 # 51 def producer(produce, consume,n): 52 consume.close() 53 for i in range(n): 54 produce.send(i) 55 produce.send(None) 56 produce.send(None) 57 produce.close() 58 # 59 if __name__ == '__main__': 60 produce,consume=Pipe() 61 lock = Lock() 62 c1=Process(target=consumer,args=(produce,consume,'c1',lock)) 63 c2=Process(target=consumer,args=(produce,consume,'c2',lock)) 64 p1=Process(target=producer,args=(produce,consume,30)) 65 c1.start() 66 c2.start() 67 p1.start() 68 produce.close() 69 consume.close() 70 71 # pipe 数据不安全性 72 # IPC 73 # 加锁来控制操作管道的行为 来避免进程之间争抢数据造成的数据不安全现象 74 75 # 队列 进程之间数据安全的 76 # 管道 + 锁