python中的多处理被阻止

时间:2012-11-30 16:58:20

标签: 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

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

    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt

我做了一些测试。问题似乎是将结果放入队列实际上如果我不把结果全部起作用但是那样就没有用了。

2 个答案:

答案 0 :(得分:5)

你很可能会造成僵局。

来自programming guidelines

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

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

答案 1 :(得分:3)

好吧,看起来它是python的Queue模块中的一些错误。实际上使用..

from multiprocessing import Manager

queue = Manager().Queue()

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