码迷,mamicode.com
首页 > 其他好文 > 详细

生产者消费者模型

时间:2017-09-23 20:26:21      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:roc   font   odi   create   等待队列   ice   col   queue   es2017   

生产者消费者模型是接着上一篇:进程来写的,前面的都是基础,

生产者消费者模型是对前面知道的应用:

 

先看代码:

 

#!/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

 

 来看下运行结果:

技术分享

可以看到:生产者只管生产,并不管有没有人来吃,

但是生产完了它还得等待有消费者来消费完。

 

生产者消费者模型

标签:roc   font   odi   create   等待队列   ice   col   queue   es2017   

原文地址:http://www.cnblogs.com/Andy963/p/7582020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!