python中的多处理被阻止

blu*_*fer 5 python queue multiprocessing

我在我的项目中使用多处理.我有一个工作函数,它将结果放入队列中.一切正常.但随着x的大小增加(在我的情况下,x是一个数组)出了问题.这是我的代码的简化版本:

def do_work(queue, x):
    result = heavy_computation_function(x)
    queue.put(result)   # PROBLEM HERE

def parallel_something():
    queue = Queue()
    procs = [Process(target=do_work, args=i) for i in xrange(20)]
    for p in procs: p.start()
    for p in procs: p.join()

    results = []
    while not queue.empty():
        results.append(queue.get)

    return results
Run Code Online (Sandbox Code Playgroud)

我在系统监视器中看到python进程正常工作,但随后发生了一些事情并且所有进程都在运行但什么也没做.这是我输入ctrl-D时得到的.

    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)

我做了一些测试.问题似乎是将结果放入队列实际上如果我不把结果一切都运行但是那样就没有目的了.

fab*_*rto 5

你最有可能产生僵局.

从编程指南:

这意味着无论何时使用队列,您都需要确保在加入进程之前最终删除已放入队列的所有项目.否则,您无法确定已将项目放入队列的进程将终止.还要记住,非守护进程会自动加入.

页面中还提出了一种可能的解决方法.请记住,如果没有加入流程,并不意味着它们在任何意义上都"占用"了资源.这意味着您可以在进程完成其操作(可能使用锁定)之后获取排队的数据,并且稍后才能加入进程.


blu*_*fer 3

嗯,看起来这是 python 的 Queue 模块中的一些错误。事实上使用..

from multiprocessing import Manager

queue = Manager().Queue()
Run Code Online (Sandbox Code Playgroud)

..一切正常,但我仍然不知道为什么..:)