![](/img/trans.png)
[英]multiprocessing.Pool: When to use apply, apply_async or map?
[英]Is there a way for workers in multiprocessing.Pool's apply_async to catch errors and continue?
当使用multiprocessing.Pool的apply_async()
,代码中断会发生什么? 我认为这包括异常,但可能还有其他因素导致工作者功能失败。
import multiprocessing as mp
pool = mp.Pool(mp.cpu_count())
for f in files:
pool.apply_async(workerfunct, args=(*args), callback=callbackfunct)
正如我现在所理解的那样,进程/工作程序失败(所有其他进程都继续)并且没有执行抛出错误的任何事情,即使我用try / except捕获错误也是如此。
作为一个例子,通常我除了错误并输入默认值和/或打印出错误消息,然后代码继续。 如果我的回调函数涉及写入文件,则使用默认值完成。
我怀疑你没有看到你的示例代码发生任何事情的原因是因为所有的工作者函数调用都失败了。 如果worker函数失败,则永远不会执行回调。 除非您尝试从apply_async调用返回的AsyncResult对象中获取结果,否则根本不会报告失败。 但是,由于您没有保存任何这些对象,因此您永远不会知道发生的故障。 如果我是你,我会在你测试时尝试使用pool.apply,这样你就会在发生错误时立即看到错误。
如果您使用的是Python 3.2+,则可以使用error_callback
关键字参数来处理在worker中引发的异常。
pool.apply_async(workerfunct, args=(*args), callback=callbackfunct, error_callback=handle_error)
将使用异常对象作为参数调用handle_error
。
如果不是,则必须在try
/ except
包装所有工作函数,以确保执行callback
。 (我认为你的印象是,在其他问题上我的回答不起作用,但事实并非如此。抱歉!):
def workerfunct(*args):
try:
# Stuff
except Exception as e:
# Do something here, maybe return e?
pool.apply_async(workerfunct, args=(*args), callback=callbackfunct)
如果您不想/不想更改实际要调用的函数,也可以使用包装函数:
def wrapper(func, *args):
try:
return func(*args)
except Exception as e:
return e
pool.apply_async(wrapper, args=(workerfunct, *args), callback=callbackfunct)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.