zoukankan      html  css  js  c++  java
  • 进程的队列通信——消费者生产者的模型

    from multiprocessing import Process, JoinableQueue
    import time
    
    
    def shop(q, shopping):
        for i in range(10):
            q.put('包子')
            print('%s 好了 %s' % (shopping, i))
    
    
    def person(q):
        while True:
            food = q.get()
            print('客户吃了一个%s' % food)
            q.task_done()
    

    错误案例:

    if __name__ == '__main__':
        q = JoinableQueue()
        q1 = Process(target=shop, args=(q, 'egon'))
        q2 = Process(target=shop, args=(q, 'alex'))
        c1 = Process(target=person, args=(q,))
        q1.start()
        q2.start()
        c1.daemon = True
        c1.start()
        time.sleep(0.65)
        # print(q.get_nowait())  # 这样写发现,q是空的,因为此时,进程q1,q2还没往队列中添加值,所以此时,q.join()是完成的,直接主程序完成,所以,c1 根本没来得及执行就结束了
        q.join()               # 说明代码的执行远远快于 进程 的创建和执行。所以,要等 进程 q1,q2 完成后,在执行q.join()
                               # 加上time.sleep(0.5)程序可以部分的运行正常,即 进程 q1,q2 在这段时间已经完成了一部分添加。但是可能会提前取完
                               # 如图所示
        print('主程序')
    

    正确案例:

    if __name__ == '__main__':
        q = JoinableQueue()
        q1 = Process(target=shop, args=(q, 'egon'))
        q2 = Process(target=shop, args=(q, 'alex'))
        c1 = Process(target=person, args=(q,))
        q1.start()
        q2.start()
        c1.daemon = True  # 这里设置 进程 c1 是主程序的守护进程
        c1.start()
        q1.join()  # 要在进程 q1 , q2 将数据添加完成后,再判断 q 是否所有数据都取出,也就是 进程 c1 是否可以结束了,
        q2.join()  
        q.join()
    
        print('主程序')
    
  • 相关阅读:
    python
    Yii框架的学习指南(策码秀才篇)1-1 如何认识Yii framework
    yii执行流程简单介绍
    html5页面编码如何确定
    防止表单重复提交的几种策略
    2维数组排序
    YII框架开发一个项目的通用目录结构:
    phpcms添加图片投票
    windows下面apache配置虚拟目录(测试使用,发布网站不建议目录访问)
    js获取浏览器的版本代码
  • 原文地址:https://www.cnblogs.com/pythonwl/p/12761332.html
Copyright © 2011-2022 走看看