首页 > 解决方案 > Py3.6 :: ThreadPoolExecutor future.add_done_callback 与 concurrent.futures.as_completed

问题描述

我在 Py3.6 中学习concurrent.futures.ThreadPoolExecutor并且对使用之间的区别和利弊有点困惑

1 future.add_done_callback(回调)

2 concurrent.futures.as_completed(futures)

你什么时候会选择一个而不是另一个?如果我理解正确,两者的目的或多或少是相同的。#1callback(future)在任务完成并且相应的未来已经结算后立即调用 fn,而 #2returns the futures object按照任务完成和期货结算的顺序调用。

在这两种情况下,我们都可以使用 future.results() 检索返回值(或者如果引发异常,则引发 future.exception() )。

感谢您对此进行任何澄清。

标签: python-3.x

解决方案


函数的定义在https://github.com/python/cpython/blob/f85af035c5cb9a981f5e3164425f27cf73231b5f/Lib/concurrent/futures/_base.py#L200

def as_completed(fs, timeout=None):
    """An iterator over the given futures that yields each as it completes.

add_done_callback 是期货类中的一个方法,是比 as_completed 更低级别的函数。本质上, as_completed 在内部使用 add_done_callback。as_completed 也有回调的超时参数。一般来说,如果使用多个future,我们可以使用as_completed,而add_done_callback 用于单个future。总体而言, add_done_callback 和 as_completed 都可以为更简单的程序实现类似的目标。

只是一个想法。我们可以使用 add_done_callback 为期货列表中的每个期货使用不同的回调函数,而 as_completed 可能只接受单个回调。


推荐阅读