生产者消费者模型中Queue理解

来源:互联网 发布:淘宝企业店铺能转让吗 编辑:程序博客网 时间:2024/06/06 16:32

在生产者消费者模型中,Queue用作两者之间的缓冲
这里写图片描述

但是由于Queue的内在机理中包含着自动执行wait、notify等功能的机制,于是单从程序代码上看起来会很奇怪。

比如这段代码(转自星火博客)

from multiprocessing import Process,Queueimport time,random,osdef consumer(q):    while True:        time.sleep(random.randint(1,3))        res=q.get()        if res is None:break        print('\033[45m消费者拿到了:%s\033[0m' %res)def producer(seq,q):    for item in seq:        time.sleep(random.randint(1,3))        print('\033[46m生产者生产了:%s\033[0m' %item)        q.put(item)if __name__ == '__main__':    q=Queue()    c=Process(target=consumer,args=(q,))    c.start()    producer(('包子%s' %i for i in range(5)),q)    q.put(None)    c.join()    print('主线程')

如果不了解Queue的内在机理,就会纳闷:consumer开始运行时producer没运行,此时queue是空的啊,为什么在producer向里面装东西之后consumer会自动运行,并且是随着produer一边装入,consumer一边运行?
其实,其内在在于multiprocessing.Queue内在实现是包含类似于threading中的lock和Condition.wait、Condition.notify功能的,在Queue存在时,他会调用wait等待put数据,然后put在推入数据过后会notify,而后wait回响应,继续执行程序。
具体内容可以参考转载自伯乐在线的文章Python中的生产者消费者问题