python中的多处理被阻止



我在我的项目中使用了多处理。我有一个工作器函数,可以将结果放入队列。一切正常。但是随着 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

我做了一些测试。问题看起来像是将结果放入队列中,实际上如果我不将结果一切正常,但那样就没有目的了。

您很可能正在生成死锁。

从编程指南:

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

页面中还提出了可能的修复方法。请记住,如果未加入流程,并不意味着它们在任何意义上都"占用"资源。这意味着您可以在进程完成其操作(可能使用锁)后取出排队的数据,然后才加入进程。

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

from multiprocessing import Manager
queue = Manager().Queue()

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

最新更新