2014-02-28 39 views
8

我正在使用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! 

有没有一种方法,以显示我的工作线程存在的无所有异常手动提高我自己的?

回答

18

该错误是没有提出,除非你叫AsyncResultget method(在apply_async的返回值):

按照AsyncResult.get documentation

返回结果当它到达。如果超时不是无,并且 结果未在超时秒内到达,则会引发 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!" 
+0

哇,这很快。谢谢。 – Dschoni

+0

对不起,我猜那是我意外。我经常回到这个答案......但是我的downvote不能被取消2个小时。抱歉。 – Dschoni

2

我想falsetru给你所需要的。我只想扩大一点。

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

这对mp.Pool不起作用,所以它只是为了防止你需要更多的东西。 This SO Question使用更明确的多处理技术而不是mp.Pool覆盖了您的问题。