生产者消费者模型
Posted 安迪_963
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产者消费者模型相关的知识,希望对你有一定的参考价值。
生产者消费者模型是接着上一篇:进程来写的,前面的都是基础,
生产者消费者模型是对前面知道的应用:
先看代码:
#!/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
来看下运行结果:
可以看到:生产者只管生产,并不管有没有人来吃,
但是生产完了它还得等待有消费者来消费完。
以上是关于生产者消费者模型的主要内容,如果未能解决你的问题,请参考以下文章