我正在使用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,那么这两段代码是等效的吗? 两者的优缺点是什么?
谢谢
AsyncResult
和callback
之间的比较有些不走运。 请注意,您只有可用于异步方法(返回AsyncResult
对象的回调(,因此此故事中没有关于这些事情的"vsus"。
当你写check_result(result.get())
时,你不会将一些AsyncResult
对象传递到check_result
,而是一个已经等待的正常结果,在你的例子中是一个布尔值(如果不是例外的话(。所以这不是AsyncResult
和callback
之间的区别,而是手动调用结果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"也是减少的代码长度。仅将两者用于立即返回检查和日志记录等任务,以防止阻塞运行池的线程。