我在我的项目中使用多处理。我有一个工作函数,它将结果放入队列中。一切正常。但是随着 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
我做了一些测试。问题似乎出在将结果放入队列中,实际上如果我不将结果放入队列,一切正常,但那样就没有任何意义。
最佳答案
您很可能会产生死锁。
这意味着无论何时您使用队列,您都需要确保所有已放入队列的项目最终都会在加入进程之前被删除。否则,您无法确定将项目放入队列的进程是否会终止。还要记住,非守护进程将自动加入。
页面中还提出了一个可能的修复方法。请记住,如果进程没有加入,这并不意味着它们在任何意义上都在“占用”资源。这意味着您可以在进程完成操作(可能使用 locks )后取出排队的数据,然后才加入进程。
关于python - python中的多处理被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649625/