基于队列实现生产者消费者模型

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 %

 

 
 
 
 
 
 
 
 
 
 

posted @ 2020-12-26 16:09  anobscureretreat  阅读(106)  评论(0编辑  收藏  举报