AysncResult 和 python 池中带有error_callback的回调之间的区别



我正在使用Pools在python3.6中启动工作进程。 工作线程将在完成后返回 True 或 False,我想知道使用 AsyncResult 返回对象或使用回调函数检查工作线程是否返回 True 或 False 有什么区别。 据我了解,回调是在主进程中调用的,无论如何我都会在同一个地方进行检查。

#Using the AsyncResult way
def check_result(result):
if result:
#Successful do something
else:
#Failed
with Pool() as pool:
result = pool.apply_async(upload, (args, ))
check_result(result.get())
#Using callbacks 
def check_result(result):
if result:
#Successful do something
def err_result(result):
#Do something
with Pool() as pool:
pool.appy_async(upload, (args,), callback=check_result, error_callback=err_result)

我看到在python3.6中他们允许error_callback,那么这两段代码是等效的吗? 两者的优缺点是什么?

谢谢

AsyncResultcallback之间的比较有些不走运。 请注意,您只有可用于异步方法(返回AsyncResult对象的回调(,因此此故事中没有关于这些事情的"vsus"。

当你写check_result(result.get())时,你不会将一些AsyncResult对象传递到check_result,而是一个已经等待的正常结果,在你的例子中是一个布尔值(如果不是例外的话(。所以这不是AsyncResultcallback之间的区别,而是手动调用结果check_result或事先注册回调之间的区别。

我看到在python3.6中它们允许error_callback,那么这两段代码是等效的吗?两者的优缺点是什么?

不,这两个代码段并不等效。error_callback是一个异常处理程序,则可能的False-result 不会触发该处理程序,但异常会触发该处理程序。 在这种情况下,err_result中的result参数将填充异常实例。与上部片段的不同之处在于,一旦您调用result.get()并且您没有将其包含在 try-except-block 中,那里的异常就会在您的脸上爆炸。

error_callback的明显"pro"是省略的try-except-block,常规回调的"pro"也是减少的代码长度。仅将两者用于立即返回检查和日志记录等任务,以防止阻塞运行池的线程。

相关内容

  • 没有找到相关文章

最新更新