Python——管道通信

管道:双向通信 2个进程之间相互通信

 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()
实例

利用管道解决消费者模式

 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 # 管道 + 锁
例子

 

posted @ 2018-10-22 17:17  澄心元素  阅读(1693)  评论(0编辑  收藏  举报