【问题标题】:Python multiprocessing queue is emptyPython多处理队列为空
【发布时间】: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.Poolconcurrent.futures.ProcessPoolExecutor 而不是手动构建池?当然你可以自己做所有的事情,但是有很多地方你可能会犯错误,尤其是你的第一次,而且要编写和阅读的代码要多得多,所以除非你需要做他们做不到的事情……
  • pools 和 futures,就像 abarnert 所说的那样,是构建这种代码的方式。我只是在这里详细说明了(stackoverflow.com/a/69095442/31024

标签: python queue multiprocessing


【解决方案1】:

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

您可以查看“加入使用队列的进程”下的multiprocessing guidelines,以更好地解释该问题。

只需交换联接和 Queue.get 逻辑,一切都会正常。

不过,我宁愿使用Pool of workers 来解决您的问题。

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2015-04-20
    • 2011-10-29
    • 1970-01-01
    • 2018-06-30
    • 2012-07-11
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多