关于python3 multiprocessing Pool进程池传参队列multiprocessing Queue的问题

在使用线程池进行多进程的时候,传入Queue去做进程中的通信的时候发现,子进程没有运行就退出了,比如如下写:

from multiprocessing import Pool, Queue

def test(q):
    print("start")
    while not q.empty():
        value = q.get()
        print('Get %s from queue.' % value)

if __name__=='__main__':
    q = Queue()
    for i in range(4):
        q.put(i)
    p = Pool(4)
    for i in range(4):
        p.apply_async(test, args=(q,))
    p.close()
    p.join()
    print("down")

子进程怎么没有运行,于是我就测试了一下,发现子进程真的没有运行。

将其中的参数q换成普通参数就能完整运行,说明问题出现在传入的参数为multiprocessing Queue的为提上,于是乎谷歌一下找到以下:

python - Sharing a result queue among several processes - Stack Overflow

所以不用multiprocessing提供的Queue, 而是使用multiprocessing.Manager来管理队列,于是简单修改一下代码如下:

from multiprocessing import Pool, Manager

def test(q):
    print("start")
    while not q.empty():
        value = q.get()
        print('Get %s from queue.' % value)

if __name__=='__main__':
    m = Manager()
    q = m.Queue()
    for i in range(4):
        q.put(i)
    p = Pool(4)
    for i in range(4):
        p.apply_async(test, args=(q,))
    p.close()
    p.join()
    print("done")

看到结果是正确的。

查阅官方文档显示:

A manager object returned by Manager() controls a server process which holds Python objects and allows > > other processes to manipulate them using proxies.
A manager returned by Manager() will support types list, dict, Namespace, Lock, RLock, Semaphore,
BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.

可以看出multiprocess.Manager()可以用来管理临界区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值