zoukankan      html  css  js  c++  java
  • JoinableQueue

    #!/usr/bin/env python
    # encoding: utf-8  
    # Date: 2018/6/17
    import time
    from multiprocessing import Process, JoinableQueue


    def producer(q):
        for i in range(10):
            res = '包子 %s' % i
            time.sleep(0.5)  # 模拟生产者造一条数据的时间
            print('生产者生产了%s' % res)
            # consumer(res)  # 生产者生产的数据不能直接交给消费者
            q.put(res)  # 生产者生产的数据交给容器queue
        q.join()  # 等到消费者把自己放入队列中的所有的数据都取走之后,生产者才结束


    def consumer(q):
        while True:  # 一直接消息
            res = q.get()
            if res is None: break  # 因为生产者最后一个放的是None
            time.sleep(1)
            print('消费者消费了%s' % res)
            q.task_done()  # 发送信号给q.join(),说明已经从队列中取走一个数据并处理完毕了


    if __name__ == '__main__':
        # 容器
        # q = Queue()  # 解耦和生产者和消费者
        q = JoinableQueue()
        p1 = Process(target=producer, args=(q, ))
        p2 = Process(target=producer, args=(q, ))
        p3 = Process(target=producer, 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()  # 主进程保证生产者可以生产完毕
        # q.put(None)  # 生产完毕之后,添加一个None数据,这种模式生产者消费者多了就需要发多个None,并且joinN个生产者
        # 1、主进程等生产者p1、p2、p3结束
        # 2、而p1、p2、p3是在消费者把所有数据都取干净之后才会结束
        # 3、所以一旦p1、p2、p3结束了,证明消费者也没必要存在了,应该随着主进程一块死掉,因而需要将生产者们设置成守护进程
        print('主')

  • 相关阅读:
    swagger 兼容 docker 转发 配置
    rust 条件编译 Debug Release
    rust-must-know-crates-5ad8 100DayOfRust
    python C# DES 加密转换
    The Little Book of Rust Books
    swiper 禁止滑动
    uniapp自定义凸出的导航栏
    uniapp css实现双排菜单向左滑动
    uniapp开发公众号,微信设置字体大小后,禁止改变页面字体大小
    uniapp接口封装
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9194393.html
Copyright © 2011-2022 走看看