我有一个令人尴尬的并行代码,它创建了一个数组列表,我想并行化它(这是我第一次使用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
我觉得我有一个小错误/误解,因为我确保过程正在运行和结束。
非常感谢你的帮助!
答案 0 :(得分:0)
问题在于您在排空队列之前加入了进程。
您可以查看使用队列的"加入流程下的multiprocessing guidelines"为了更好地解释这个问题。
只需交换连接和Queue.get逻辑,一切都应该有效。
尽管如此,我宁愿使用Pool of workers来解决您的问题。