如何在多处理中捕获工作程序中的异常

时间:2014-02-28 12:10:49

标签: python python-2.7 multiprocessing

我正在使用Python(2.7.3)中的多处理模块,并希望调试我的工作人员正在进行的一些事情。但是,我似乎无法在工作线程中捕获任何异常。

一个最小的例子:

import multiprocessing as mp


a=[1]
def worker():
    print a[2]


def pool():
    pool = mp.Pool(processes=1)
    pool.apply_async(worker, args = ())
    pool.close()
    pool.join()
    print "Multiprocessing done!"


if __name__ == '__main__':
    pool()

预计会引发IndexError,但我的输出只是

    Multiprocessing done!

有没有办法向我展示工作线程中发生的所有异常而无需手动提升我自己的?

2 个答案:

答案 0 :(得分:23)

除非您拨打get methodAsyncResultapply_async的返回值),否则不会引发错误:

根据AsyncResult.get documentation

  

结果到达时返回结果。如果超时不是None而且   结果在超时秒内没有到达   引发了multiprocessing.TimeoutError。 如果远程呼叫引发了   例外,该异常将由get()重新加载。

def pool():
    pool = mp.Pool(processes=1)
    result = pool.apply_async(worker, args=())
    result.get() # <------------
    pool.close()
    pool.join()
    print "Multiprocessing done!"

答案 1 :(得分:2)

我认为falsetru给了你所需要的东西。我想再扩展一点。

如果您不仅要获得错误而且要获取原始上下文(即知道在worker()的第1行发生了异常),那么您可以检查this nice post by Ned Batchelder,其中解释了如何使用他们原来的背景。

这对mp.Pool不起作用,以防你需要更多东西。 This SO Question使用更明确的多处理技术而不是mp.Pool来解决您的问题。