我正在使用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,所以这两位代码等效吗?两者的优缺点是什么?
谢谢
答案 0 :(得分:1)
AsyncResult
和callback
之间的比较有些不幸。
请注意,您只有可用于异步方法的回调(返回AsyncResult
对象),因此,在本故事中,关于这些事情没有“与”相对。
在编写check_result(result.get())
时,您没有将某些AsyncResult
对象传递到check_result
中,而是传递了一个已经等待的正常结果,在您的情况下为布尔值(如果不是例外) )。因此,AsyncResult
和callback
之间没有什么区别,而是在结果上手动调用check_result
或预先注册回调之间。
我看到在python3.6中它们允许error_callback,所以这两位代码等效吗?两者的优缺点是什么?
否,这两个摘要不相同。 error_callback
是一个异常处理程序,您可能获得的False
结果不会触发该异常处理程序,但会触发异常。
在这种情况下,您在result
中的err_result
自变量将被一个异常实例填充。与上段代码的区别在于,调用result.get()
后,您的脸上就会出现异常,并且您没有将其包含在try-except-block中。
error_callback
的明显“ pro”是省略的try-except-block,常规回调的“ pro”也减少了代码长度。两者都仅用于立即返回的任务,例如检查和日志记录,以防止阻塞您的池运行所在的线程。