【发布时间】:2015-04-17 15:11:37
【问题描述】:
我有一个令人尴尬的并行代码,它创建了一个数组列表,我想将它并行化(这是我第一次使用 python 的多处理,所以我仍然掌握这些概念)。 runNramps(*args) 返回五个数组,t1,c1,e1,m1 和 d1。我想在多个线程中运行它并将所有作业的答案连接在一起。
这是我试图通过在多个进程中运行来并行化的代码。我的作业似乎可以执行并正确关闭,但是队列为空并且 queue.get() 不返回任何内容。我想我错过了将所有输出合并在一起的方法,但我在 SO/google 上找不到任何好的例子。
这是我的代码的线程化版本(我想对前一个函数进行最小的更改,只需多次调用它,将结果合并到一个数组中)。
def runPramps(numramps,rmpslope,nframes,cosmag=0,method='2pt',thresh=1.0):
output = mp.Queue()
processes = [mp.Process(target=runNramps, args=(numramps,rmpslope,nframes,cosmag,method,thresh)) for x in range(4)] #4 processes for example
for p in processes:
p.start()
print "started", p
for p in processes:
p.join()
print 'ended',p
results = output.get(False) #it hangs here
return results
我觉得我有一个小错误/误解,因为我已确保进程正在运行和结束。
非常感谢您的帮助!
【问题讨论】:
-
我们需要看到
runNramps来回答,我想。但看起来你实际上并没有将output队列传递给子进程,所以我不确定你期望任何值最终会被添加到它... -
您是否考虑过使用
multiprocessing.Pool或concurrent.futures.ProcessPoolExecutor而不是手动构建池?当然你可以自己做所有的事情,但是有很多地方你可能会犯错误,尤其是你的第一次,而且要编写和阅读的代码要多得多,所以除非你需要做他们做不到的事情…… -
pools 和 futures,就像 abarnert 所说的那样,是构建这种代码的方式。我只是在这里详细说明了(stackoverflow.com/a/69095442/31024)
标签: python queue multiprocessing