生产者消费者模型-两种写法

生产者消费者模型:

版本一、

通过将,消费者所在的进程设置成守护进程。每个生产者进程都要进行join()。

from multiprocessing import Queue,Process
import time
import random
def consumer(q,name):
   '''
  1、让消费者一直吃,但是如果队列中没有消息了,消费者就会一直等待,进入阻塞
  2、如何让生产者生产多少,消费者就吃多少,且消费者不会发生阻塞
  3、方法:将消费者进程设置成守护进程,生产者进程都需要join()等待结果
  '''
   while 1:
       print(f'{name}吃了:{q.get()}')
def producer(q,name,food):
   for i in range(10):
       time.sleep(random.random())
       foodi='%s%s'%(food,i)
       print(f'{name}生产了{foodi}')
       q.put(foodi)

if __name__ == '__main__':
   q= Queue()
   c1=Process(target=consumer,args=(q,'张三'))
   c1.daemon=True#在start前设置成守护进程,到主程序代码执行结束(不是主进程结束)后结束
   c2 = Process(target=consumer, args=(q, '李四'))
   c2.daemon = True  # 在start前设置成守护进程,到主程序代码执行结束(不是主进程结束)后结束
   c1.start()
   c2.start()

   #生产者
   p1=Process(target=producer,args=(q,'老王','云吞'))
   p2 = Process(target=producer, args=(q, '老李', '香蕉'))
   p1.start()
   p2.start()
   p1.join()
   p2.join()

版本二、

通过在队列的最后添加特殊字符来识别队列已经没有可消费的对东西了。有多少消费者就要多少个特殊字符,特殊字符是在生产者都join()后再往队列添加的。

from  multiprocessing import Process,Queue
import time
import random

def consumer(q,name):
   while 1:
       food = q.get()
       if food==None:
           break
       print(f'{name}吃了:{food}')
       time.sleep(0.1)

def producer(q,name,food):
   for i in range(10):
       foodi=food+str(i)
       print(f'{name}生产了:{foodi}')
       q.put(foodi)
       time.sleep(random.random())

if __name__ == '__main__':
   q=Queue()
   p1=Process(target=producer,args=(q,'张三','苹果'))
   p2=Process(target=producer,args=(q,'李四','香蕉'))
   p1.start()
   p2.start()

   c1 = Process(target=consumer,args=(q,'小明'))
   c2 = Process(target=consumer,args=(q,'老米'))
   c1.start()
   c2.start()
   p1.join()
   p2.join()
   q.put(None)#两个消费者,最后要put两个None进入队列
   q.put(None)



posted @ 2021-08-19 09:29  提笔按住它  阅读(167)  评论(0)    收藏  举报