Python多处理队列为空

时间:2015-04-17 15:11:38

标签: python queue multiprocessing

我有一个令人尴尬的并行代码,它创建了一个数组列表,我想并行化它(这是我第一次使用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

我觉得我有一个小错误/误解,因为我确保过程正在运行和结束。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

问题在于您在排空队列之前加入了进程。

您可以查看使用队列的"加入流程下的multiprocessing guidelines"为了更好地解释这个问题。

只需交换连接和Queue.get逻辑,一切都应该有效。

尽管如此,我宁愿使用Pool of workers来解决您的问题。