python中的多处理
我在我的项目中使用多重处理。我有一个worker函数,它将结果放入一个队列中。一切正常。但随着x的大小增加(在我的例子中,x是一个数组),出现了一些问题。以下是我的代码的简化版本:python中的多处理,python,queue,multiprocessing,Python,Queue,Multiprocessing,我在我的项目中使用多重处理。我有一个worker函数,它将结果放入一个队列中。一切正常。但随着x的大小增加(在我的例子中,x是一个数组),出现了一些问题。以下是我的代码的简化版本: def do_work(queue, x): result = heavy_computation_function(x) queue.put(result) # PROBLEM HERE def parallel_something(): queue = Queue() pro
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()
…一切正常,但我仍然不知道原因:)您很可能正在产生死锁 从: 这意味着,无论何时使用队列,都需要确保在加入流程之前,已放入队列的所有项目最终都将被删除。否则,您无法确保将项目放入队列的进程将终止。还要记住,非守护进程将自动加入
本页还提出了一个可能的修复方案。请记住,如果进程没有连接,这并不意味着它们在任何意义上“占用”资源。这意味着您可以在进程完成操作(可能使用)后将排队的数据取出,然后再加入进程。您似乎永远不会将队列对象传递给新进程。另外,
Process
的args
应该是一个tuple
。尝试将其更改为args=(队列,i)
。您的queue.get
还需要一些括号,以便它成为queue.get()
。区别在于您正在实例化Manager().queue()
,而不是简单的queue()
。我认为这意味着Manager.\uuuu init\uuuu()
会在第一种形式中被调用,但不会在第二种形式中被调用。