进程通信IPC机制
一、进程间通信
1 from multiprocessing import Queue 2 3 q = Queue(5) # 括号内可以传参数,表示的是这个队列的最大存储数 4 # 往队列中添加数据 5 q.put(1) 6 q.put(2) 7 q.put(3) 8 print((q.full())) #判断队列是否满了 9 q.put(4) 10 q.put(5) 11 print(q.full()) 12 q.put(6) # 当队列满了之后 再放入数据 不会报错 会原地等待 直到队列中有数据被取走(阻塞态) 13 14 print(q.get()) 15 print(q.get()) 16 print(q.get()) 17 print(q.empty()) #判断队列中的数据是否取完 18 print(q.get()) 19 print(q.get()) 20 print(q.empty()) 21 print(q.get_nowait()) # 取值 没有值不等待直接报错 22 print(q.get()) # 当队列中的数据取完之后 再次获取 程序会阻塞 直到有人往队列中放入值 23 24 ''' 25 full 26 get_nowait 27 empty 28 都不适用于多进程的情况 29 '''
二、进程间通信PCI机制
1 from multiprocessing import Process,Queue 2 3 def producer(q): 4 q.put('hey guy') 5 6 def cousumer(q): 7 print(q.get()) 8 9 10 if __name__ == '__main__': 11 q = Queue() 12 p = Process(target=producer,args=(q,)) 13 c = Process(target=cousumer,args=(q,)) 14 p.start() 15 c.start()
三、生产者消费者模型
1 from multiprocessing import Process,JoinableQueue 2 import time 3 import random 4 5 def producer(name,food,q): 6 for i in range(10): 7 data = '%s制作了%s'%(name,food) 8 time.sleep(random.random()) 9 q.put(data) 10 print(data) 11 12 def consumer(name,q): 13 while True: 14 data = q.get() 15 if data == None:break 16 print('%s吃了%s'%(name,data)) 17 time.sleep(random.random()) 18 q.task_done() #告诉队列你已经从队列中取出了一个数据 并且处理完毕了 19 20 if __name__ == '__main__': 21 q = JoinableQueue() 22 p = Process(target=producer,args=('大厨egon','黄焖鸡米饭',q)) 23 p1 = Process(target=producer,args=('跟班tank','生蚝',q)) 24 c = Process(target=consumer,args=('吃货jerry',q)) 25 c1 = Process(target=consumer,args=('吃货jason',q)) 26 p.start() 27 p1.start() 28 c.daemon = True 29 c1.daemon = True 30 c.start() 31 c1.start() 32 p.join() 33 p1.join() 34 35 q.join() # 等待队列中数据全部取出