2014-10-08 37 views
0

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

如何让池中的进程报告错误,并在出现错误时终止进程?

回答

3

你有实际尝试getapply_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关键字参数,它允许您传递一个回调,如果worker中出现异常,则会执行回调,但在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 
+0

非常适合您的信息。非常感谢!我想我会转向Python 3.2以简化操作。 – 2014-10-08 16:33:59

+0

@ASDF如果可能的话,我会推荐到3.4(更新),但是,Python 3.x会让你的生活更轻松。如果没有太多的工作来移植你的程序,那就去做吧。 – dano 2014-10-08 16:37:10