Python 多处理池中的进程不报告运行时错误

Python 多处理池中的进程不报告运行时错误,python,multiprocessing,python-multiprocessing,Python,Multiprocessing,Python Multiprocessing,我在python中有一个进程池,使用来自多处理导入池的。我将要运行的不同函数传递给这些进程,调用池.apply\u async函数。如果我在其中一个函数中引入错误(即:一行代码,如5/0),则预期的命令行报告ZeroDivisionError:integer division或modulo by zero将永远不会显示,程序也永远不会终止。即使在调用Pool.apply_async时引入回调函数,如果进程必须执行的函数有错误,也不会调用回调函数 我如何让池中的这些进程报告错误并在出现错误时终止?

我在python中有一个进程池,使用来自多处理导入池的
。我将要运行的不同函数传递给这些进程,调用
池.apply\u async
函数。如果我在其中一个函数中引入错误(即:一行代码,如
5/0
),则预期的命令行报告
ZeroDivisionError:integer division或modulo by zero
将永远不会显示,程序也永远不会终止。即使在调用
Pool.apply_async
时引入回调函数,如果进程必须执行的函数有错误,也不会调用回调函数


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

您必须实际尝试从
apply\u async
(或
map\u async
)返回的结果,以便在父进程中引发异常

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

...
result = pool.apply_async(func, args=(arg))
time.sleep(2)
result.get() # Exception only gets raised here
您提供的任何
回调
仅在函数成功返回时执行。如果引发异常,将跳过它

在Python3.2+中,引入了关键字参数,它允许您传递一个回调,如果在worker中引发异常,将执行该回调,但在Python2.x中不能这样做。您可以在一个
try
/
块中使用wrap-your worker函数,该块返回在worker中引发的任何异常,而不是引发异常:

def func():
    try:
        raise Exception("We failed")
    except Exception as e:
        return e
然后,您可以使用一个常规回调函数来检查是否返回了
异常

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

您必须实际尝试从
apply\u async
(或
map\u async
)返回的结果中获取异常,以便在父级中引发异常

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

...
result = pool.apply_async(func, args=(arg))
time.sleep(2)
result.get() # Exception only gets raised here
您提供的任何
回调
仅在函数成功返回时执行。如果引发异常,将跳过它

在Python3.2+中,引入了关键字参数,它允许您传递一个回调,如果在worker中引发异常,将执行该回调,但在Python2.x中不能这样做。您可以在一个
try
/
块中使用wrap-your worker函数,该块返回在worker中引发的任何异常,而不是引发异常:

def func():
    try:
        raise Exception("We failed")
    except Exception as e:
        return e
然后,您可以使用一个常规回调函数来检查是否返回了
异常

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

您必须实际尝试从
apply\u async
(或
map\u async
)返回的结果中获取异常,以便在父级中引发异常

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

...
result = pool.apply_async(func, args=(arg))
time.sleep(2)
result.get() # Exception only gets raised here
您提供的任何
回调
仅在函数成功返回时执行。如果引发异常,将跳过它

在Python3.2+中,引入了关键字参数,它允许您传递一个回调,如果在worker中引发异常,将执行该回调,但在Python2.x中不能这样做。您可以在一个
try
/
块中使用wrap-your worker函数,该块返回在worker中引发的任何异常,而不是引发异常:

def func():
    try:
        raise Exception("We failed")
    except Exception as e:
        return e
然后,您可以使用一个常规回调函数来检查是否返回了
异常

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

您必须实际尝试从
apply\u async
(或
map\u async
)返回的结果中获取异常,以便在父级中引发异常

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

...
result = pool.apply_async(func, args=(arg))
time.sleep(2)
result.get() # Exception only gets raised here
您提供的任何
回调
仅在函数成功返回时执行。如果引发异常,将跳过它

在Python3.2+中,引入了关键字参数,它允许您传递一个回调,如果在worker中引发异常,将执行该回调,但在Python2.x中不能这样做。您可以在一个
try
/
块中使用wrap-your worker函数,该块返回在worker中引发的任何异常,而不是引发异常:

def func():
    try:
        raise Exception("We failed")
    except Exception as e:
        return e
然后,您可以使用一个常规回调函数来检查是否返回了
异常

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

非常适合你的信息。谢谢!我想我会转向Python3.2以使事情更简单。@ASDF如果可能的话,我会建议您转向3.4(它更新得多),但是是的,Python3.x会让您的生活更轻松。如果移植你的程序不需要太多的工作,那就去做吧。非常适合你的信息。谢谢!我想我会转向Python3.2以使事情更简单。@ASDF如果可能的话,我会建议您转向3.4(它更新得多),但是是的,Python3.x会让您的生活更轻松。如果移植你的程序不需要太多的工作,那就去做吧。非常适合你的信息。谢谢!我想我会转向Python3.2以使事情更简单。@ASDF如果可能的话,我会建议您转向3.4(它更新得多),但是是的,Python3.x会让您的生活更轻松。如果移植你的程序不需要太多的工作,那就去做吧。非常适合你的信息。谢谢!我想我会转向Python3.2以使事情更简单。@ASDF如果可能的话,我会建议您转向3.4(它更新得多),但是是的,Python3.x会让您的生活更轻松。如果移植你的程序不需要太多的工作,那就去做吧。