生产者消费者模型是接着上一篇:进程来写的,前面的都是基础,
生产者消费者模型是对前面知道的应用:
先看代码:
#!/usr/bin/env python
#coding:utf-8
#Created by Andy @ 2017/9/20
import time, os, random
from multiprocessing import JoinableQueue,Process
def produce_bread(q):
for i in range(1,5):
time.sleep(2)
res = "第%s个bread" % i
q.put(res)
print("%s制造了%s面包" % (os.getpid(), res))
q.join()
def produce_noodle(q):
for i in range(1,3):
time.sleep(3)
res = "第%s碗noodle" % i
q.put(res)
print("%s制造了%s面条" %(os.getpid(), res))
q.join()
def produce_rice(q):
for i in range(1,6):
time.sleep(4)
res = "第%s 碗米饭" % i
q.put(res)
print("%s制造了%s" %(os.getpid(), res))
q.join()
def consumer(q):
while True:
res = q.get()
time.sleep(random.randint(2,5))
print( "\033[44m%s吃了%s\033[0m"%(os.getpid(),res))
q.task_done()
if __name__ == "__main__":
q = JoinableQueue()
p1 = Process(target=produce_rice, args=(q,))
p2 = Process(target=produce_bread, args=(q,))
p3 = Process(target=produce_noodle, args=(q,))
c1 = Process(target=consumer, args=(q,))
c2 = Process(target=consumer, args=(q,))
c1.daemon = True
c2.daemon = True
p1.start()
p2.start()
p3.start()
c1.start()
c2.start()
p1.join()
p2.join()
p3.join()
print("Finish!")

当主进程启动后,随即生产者进程启动,假设现在生产了一个食品,
也就是Queue中有一个元素,生产者在生产完这一个食品之后 由于
q.join 进入了等待Queue取空才会结束当前进程。
那现在假设一个消费者进程来吃掉了这个食品,此时队列q为空,消费者
在取掉这个食品之后 经过q.task_done()给生产者发送信号,街道者知道
队列q为空了,此时生产者进程可以结束了,主进程看到生产者进程结束
也可以结束了,但是此时:消费者进程仍然卡在那里,因为它在等待队列q,
不停的从队列中get数据q.get(),所以如果直接结束,那么消费者进程就成了僵尸进程了
那么,要怎么才能让主进程结束时让消费者进程也结束呢?
显然这里可以用守护的方法
就是前面的设置:
c1.daemon = True
来看下运行结果:

可以看到:生产者只管生产,并不管有没有人来吃,
但是生产完了它还得等待有消费者来消费完。
原文:http://www.cnblogs.com/Andy963/p/7582020.html