生产者消费者模型-两种写法
版本一、
通过将,消费者所在的进程设置成守护进程。每个生产者进程都要进行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()
版本二、
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)

浙公网安备 33010602011771号