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

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

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

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

from multiprocessing import Process,Queue
import time,random,os


def 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中的生产者消费者问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值