基于队列实现生产者消费者模型
code
from multiprocessing import Process,Queue import time,random,os def consumer(q,p1): while True: res=q.get() if(res=="finish"): break time.sleep(random.randint(1,3)) print('%s 吃 %s' %(os.getpid(),res)) def producer(q): for i in range(10): time.sleep(random.randint(1,3)) res='包子%s' %i q.put(res) print('生产了 %s' %(str(os.getpid())+res)) if __name__ == '__main__': q=Queue() #生产者们:即厨师们 q.put("tea") p1=Process(target=producer,args=(q,)) #消费者们:即吃货们 c1=Process(target=consumer,args=(q,p1),) #开始 p1.start() c1.start() p1.join() q.put("finish") print('主')
Outputs
macname@MacdeMacBook-Pro py % python3 cccccc.py 58397 吃 tea 生产了 58396包子0 58397 吃 包子0 生产了 58396包子1 58397 吃 包子1 生产了 58396包子2 58397 吃 包子2 生产了 58396包子3 58397 吃 包子3 生产了 58396包子4 58397 吃 包子4 生产了 58396包子5 58397 吃 包子5 生产了 58396包子6 生产了 58396包子7 58397 吃 包子6 生产了 58396包子8 58397 吃 包子7 58397 吃 包子8 生产了 58396包子9 主 58397 吃 包子9 macname@MacdeMacBook-Pro py %
可自动退出版本
Code
from multiprocessing import Process,Queue import time,random,os def consumer(q): while True: res=q.get() if res is None:break #收到结束信号则结束 time.sleep(random.randint(1,3)) print('%s 吃 %s' %(os.getpid(),res)) def producer(q): for i in range(10): time.sleep(random.randint(1,3)) res='包子%s' %i q.put(res) print('%s生产了 %s' %(os.getpid(),res)) q.put(None) #发送结束信号 if __name__ == '__main__': q=Queue() #生产者们:即厨师们 p1=Process(target=producer,args=(q,)) #消费者们:即吃货们 c1=Process(target=consumer,args=(q,)) #开始 p1.start() c1.start() print('主')
Outputs
macname@MacdeMacBook-Pro py % python3 cccccc.py 主 58417生产了 包子0 58418 吃 包子0 58417生产了 包子1 58418 吃 包子1 58417生产了 包子2 58418 吃 包子2 58417生产了 包子3 58417生产了 包子4 58418 吃 包子3 58417生产了 包子5 58418 吃 包子4 58417生产了 包子6 58417生产了 包子7 58418 吃 包子5 58417生产了 包子8 58418 吃 包子6 58418 吃 包子7 58418 吃 包子8 58417生产了 包子9 58418 吃 包子9 macname@MacdeMacBook-Pro py %
主进程在生产者生产完毕后发送结束信号None
code
from multiprocessing import Process,Queue import time,random,os def consumer(q): while True: res=q.get() if res is None:break #收到结束信号则结束 time.sleep(random.randint(1,3)) print('%s 吃 %s' %(os.getpid(),res)) def producer(q): for i in range(2): time.sleep(random.randint(1,3)) res='包子%s' %i q.put(res) print('%s生产了 %s' %(os.getpid(),res)) if __name__ == '__main__': q=Queue() #生产者们:即厨师们 p1=Process(target=producer,args=(q,)) #消费者们:即吃货们 c1=Process(target=consumer,args=(q,)) #开始 p1.start() c1.start() p1.join() q.put(None) #发送结束信号 print('主')
Outputs
macname@MacdeMacBook-Pro py % python3 cccccc.py 58426生产了 包子0 58426生产了 包子1 58427 吃 包子0 主 58427 吃 包子1 macname@MacdeMacBook-Pro py %