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

Dsc*_*oni 9 python multiprocessing python-2.7

我正在使用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()
Run Code Online (Sandbox Code Playgroud)

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

    Multiprocessing done!
Run Code Online (Sandbox Code Playgroud)

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

fal*_*tru 24

除非你调用(的返回值)get方法,否则不会引发错误:AsyncResultapply_async

根据AsyncResult.get文件:

到达时返回结果.如果timeout不是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!"
Run Code Online (Sandbox Code Playgroud)