多处理中的进程.Pool不报告运行时错误

时间:2014-10-08 16:23:29

标签: python multiprocessing python-multiprocessing

我使用from multiprocessing import Pool在python中有一个进程池。我传递给那些进程运行不同的函数,调用Pool.apply_async函数。如果我在其中一个函数中引入错误(即:5/0之类的代码行),则预期的命令行报告ZeroDivisionError: integer division or modulo by zero永远不会显示,并且程序永远不会终止。即使我在调用Pool.apply_async时引入了一个回调函数,如果进程必须执行的函数有错误,也不会调用回调函数。

如何在池中报告错误并在出现问题时终止?

1 个答案:

答案 0 :(得分:3)

您必须实际尝试get apply_async(或map_async)返回的AsyncResult的结果,以便在父级中引发异常。

def func():
    raise Exception("We failed")

...
result = pool.apply_async(func, args=(arg))
time.sleep(2)
result.get() # Exception only gets raised here

您提供的任何callback仅在函数成功返回时执行。如果它引发异常,它会被跳过。

在Python 3.2+中,引入了error_callback关键字参数,它允许您传递在工作程序中引发异常时执行的回调,但是您无法在Python 2中执行此操作。X。你可以做的是使用在try / except块中包装你的worker函数,返回在worker中引发的任何异常,而不是提升它:

def func():
    try:
        raise Exception("We failed")
    except Exception as e:
        return e

然后你可以有一个普通的回调函数来检查是否返回了Exception

def callback(result):
   if isinstance(result, Exception):
       # Do whatever you need to do to clean up and exit
   else:
       # Function was successful