multiprocessing.Queue()和queue.Queue()的区别

from multiprocessing import Pool, Process, Queue      

# from Queue import Queue

Queue.Queue是进程内非阻塞队列,multiprocess.Queue是跨进程通信队列。

1.from queue import Queue
这个是普通的队列模式,类似于普通列表,先进先出模式,get方法会阻塞请求,直到有数据get出来为止

2.from multiprocessing.Queue import Queue( 各子进程共有
这个是多进程并发的Queue队列,用于解决多进程间的通信问题。普通Queue实现不了。例如来跑多进程对一批IP列表进行运算,运算后的结果都存到Queue队列里面,这个就必须使用multiprocessing提供的Queue来实现

#child ---child process commucation
from multiprocessing import Process,Queue
import os,time,random

def write(q):
    for value in ['a','b','c']:
        print('put %s to queue..' % value)
        q.put(value)
        time.sleep(random.random())

def read(q):
    while True:
        if not q.empty():
            value = q.get()
            print('get %s from queue' % value)
            time.sleep(random.random())
        else:
            break
if __name__ == '__main__':
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    pw.start()
    pr.start()
    pw.join()
    pr.join()
    print('all datas have been writen and been read')

如果是用進程池,那麼就需要使用Manager().Queue()隊列才能在各子進程間通信,否則沒用
 p = Pool()
    q = Manager().Queue()
    pw = p.apply_async(write,args=(q,))
    time.sleep(0.5)
    pr = p.apply_async(read,args=(q,))
    p.close()
    p.join()
    print('all datas have been writen and been read')

如果要在manger().Queue()中使用鎖,就要
manager = Manager()
    q = manager.Queue()
    lock = manager.Lock()   #鎖的獲取和釋放都一樣

參考自:https://my.oschina.net/yangyanxing/blog/296052
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值