zoukankan      html  css  js  c++  java
  • python3 multiprocessing模块下的Queue和JoinableQueue的区别

    JoinableQueue比Queue多了task_done和join方法

    from multiprocessing import JoinableQueue, Queue
    
    
    # 用法和Queue相似
    q = JoinableQueue()
    q.put("ocean")  # 队列放入一个任务,内存在一个计数机制,+1
    # q.put("can")  # 计数机制+1
    print(q.get())
    q.task_done()  # 完成一次任务,计数机制-1
    q.join()  # 计数机制不为0的时候,阻塞等待计数器为0后通过

    执行结果:

    ocean

    接着再看一个Queue的例子

    from multiprocessing import Process, Queue
    
    
    def producer(q):  # 生产
        for i in range(1, 6):
            q.put(i)  # 添加一个任务
            print("生产%s馒头" % i)
    
    
    def consumer(q):  # 消费
        while 1:
            sth = q.get()
            print("消费%s馒头" % sth)
    
    
    if __name__ == '__main__':
        q = Queue(4)
        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()
        print("stop")

    执行结果:

    生产1馒头
    生产2馒头
    生产3馒头
    生产4馒头
    消费1馒头
    生产5馒头
    消费2馒头
    消费3馒头
    消费4馒头
    消费5馒头
    生产1馒头
    生产2馒头
    生产3馒头
    生产1馒头
    消费1馒头
    生产4馒头
    消费2馒头
    生产5馒头
    消费3馒头
    消费4馒头
    消费5馒头
    消费1馒头
    消费2馒头
    生产2馒头
    消费3馒头
    生产3馒头
    消费4馒头
    生产4馒头
    消费5馒头
    生产5馒头
    stop

    把上面的程序改为JoinableQueue后的效果

    ame__ == '__main__':
        # 继承了Queue,多了两个功能,join() task_done()
        q = JoinableQueue(4)
        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()
        print("stop")

    执行结果:

    生产1馒头
    生产1馒头
    生产1馒头
    消费1馒头
    task_done一次
    消费1馒头
    task_done一次
    消费1馒头
    task_done一次
    所有连接结束join一次
    所有连接结束join一次
    所有连接结束join一次
    生产2馒头
    生产2馒头
    生产2馒头
    消费2馒头
    task_done一次
    消费2馒头
    task_done一次
    消费2馒头
    task_done一次
    所有连接结束join一次
    所有连接结束join一次
    所有连接结束join一次
    生产3馒头
    生产3馒头
    生产3馒头
    消费3馒头
    task_done一次
    消费3馒头
    task_done一次
    消费3馒头
    task_done一次
    所有连接结束join一次
    所有连接结束join一次
    所有连接结束join一次
    生产4馒头
    生产4馒头
    生产4馒头
    消费4馒头
    task_done一次
    消费4馒头
    task_done一次
    消费4馒头
    task_done一次
    所有连接结束join一次
    所有连接结束join一次
    所有连接结束join一次
    生产5馒头
    生产5馒头
    生产5馒头
    消费5馒头
    task_done一次
    消费5馒头
    task_done一次
    消费5馒头
    task_done一次
    所有连接结束join一次
    所有连接结束join一次
    所有连接结束join一次
    stop

    q.task_done() 使用者使用此方法发出信号,表示q.get()返回的项目已经被处理。也就是put取出了,计数-1。

    q.join() 生产者将使用此方法进行阻塞,直到队列中所有项目均被处理。阻塞将持续到为队列中的每个项目均调用q.task_done()方法为止。

  • 相关阅读:
    win7下环境搭建
    python简介-copy
    解决MindManager缺少mfc100u.dll无法启动的难题-转载
    Svn win7系统下状态图标不显示-转载
    【R笔记】order函数例子
    【R笔记】R语言进阶之4:数据整形(reshape)
    【R笔记】R语言利器之ddply
    天池新人实战赛之[离线赛]题目与思路
    第一次写博客
    程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/12389797.html
Copyright © 2011-2022 走看看