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('主')

  • 相关阅读:
    第一次博客园作业
    弹性布局/流动式布局
    元素在网页或视口上位置的相关问题求解
    element
    给body设置高度
    盒模型宽高的获取和设置
    选择器
    变量、作用域和内存问题
    js之捕捉冒泡和事件委托
    transition transform animate的使用
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9194393.html
Copyright © 2011-2022 走看看