0

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

如果出现问题,如何让池中的这些进程报告错误并终止?

4

1 回答 1

3

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

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块中,该块返回工作程序中引发的任何异常,而不是引发它:

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
于 2014-10-08T16:30:19.050 回答