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

时间:2018-10-02 17:52:34

标签: python python-3.x asynchronous multiprocessing

我正在使用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,所以这两位代码等效吗?两者的优缺点是什么?

谢谢

1 个答案:

答案 0 :(得分:1)

AsyncResultcallback之间的比较有些不幸。  请注意,您只有可用于异步方法的回调(返回AsyncResult对象),因此,在本故事中,关于这些事情没有“与”相对。

在编写check_result(result.get())时,您没有将某些AsyncResult对象传递到check_result中,而是传递了一个已经等待的正常结果,在您的情况下为布尔值(如果不是例外) )。因此,AsyncResultcallback之间没有什么区别,而是在结果上手动调用check_result或预先注册回调之间。

  

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

否,这两个摘要不相同。 error_callback是一个异常处理程序,您可能获得的False结果不会触发该异常处理程序,但会触发异常。 在这种情况下,您在result中的err_result自变量将被一个异常实例填充。与上段代码的区别在于,调用result.get()后,您的脸上就会出现异常,并且您没有将其包含在try-except-block中。

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