zoukankan      html  css  js  c++  java
  • Python进程间通信Queue

    1.Queue使用方法:

    • Queue.qsize():返回当前队列包含的消息数量;
    • Queue.empty():如果队列为空,返回True,反之False ;
    • Queue.full():如果队列满了,返回True,反之False;
    • Queue.get():获取队列中的一条消息,然后将其从列队中移除,可传参超时时长。
    • Queue.get_nowait():相当Queue.get(False),取不到值时触发异常:Empty;
    • Queue.put():将一个值添加进数列,可传参超时时长。
    • Queue.put_nowait():相当于Queue.get(False),当队列满了时报错:Full。

    2.Queue使用实例:

    来,上代码:

    #!/usr/bin/env python3
    
    import time
    from multiprocessing import Process,Queue
    
    q = Queue()  #创建列队,不传数字表示列队不限数量
    for i in range(11):
        q.put(i)
    
    def A():
        while 1:
            try:
                num = q.get_nowait()
                print('我是进程A,取出数字:%d'%num)
                time.sleep(1)
            except :
                break
    
    def B():
        while 1:
            try:
                num = q.get_nowait()
                print('我是进程B,取出数字:%d'%num)
                time.sleep(1)
            except :
                break
    
    p1 = Process(target = A)
    p2 = Process(target = B)
    p1.start()
    p2.start()
    

    此程序是在队列中加入10个数字,然后用2个进程来取出。

    运行结果:

    我是进程A,取出数字:0
    我是进程B,取出数字:1
    我是进程A,取出数字:2
    我是进程B,取出数字:3
    我是进程A,取出数字:4
    我是进程B,取出数字:5
    我是进程B,取出数字:6
    我是进程A,取出数字:7
    我是进程B,取出数字:8
    我是进程A,取出数字:9
    我是进程B,取出数字:10
    

    3.使用进程池Pool时,Queue会出错,需要使用Manager.Queue:

    上代码

    #!/usr/bin/env python3
    
    import time
    from multiprocessing import Pool,Manager,Queue
    
    q = Manager().Queue()
    for i in range(11):
        q.put(i)
    
    def A(i):
        num = q.get_nowait()
        print('我是进程%d,取出数字:%d'%(i,num))
        time.sleep(1)
                
    
    pool = Pool(3)
    
    for i in range(10):
        pool.apply_async(A,(i,))
    
    pool.close()
    pool.join()
    

    运行结果:

    我是进程1,取出数字:0
    我是进程0,取出数字:1
    我是进程2,取出数字:2
    我是进程4,取出数字:3
    我是进程3,取出数字:4
    我是进程5,取出数字:5
    我是进程6,取出数字:6
    我是进程7,取出数字:7
    我是进程8,取出数字:8
    我是进程9,取出数字:9
    • 当把Manager().Queue()直接换成Queue(),可能会出现资源混乱,缺少进程。
     
     
     
    好文要顶 关注我 收藏该文  
  • 相关阅读:
    (Java实现) 洛谷 P1106 删数问题
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1106 删数问题
    目测ZIP的压缩率
  • 原文地址:https://www.cnblogs.com/ExMan/p/10138503.html
Copyright © 2011-2022 走看看