concurrent.futures和asyncio.futures有什么区别?

61

为了解释这个问题的原因:

  1. 使用名称相同的两个模块会让人感到困惑,它们代表什么使它们不同?

  2. 其中一个可以解决什么任务而另一个不能,反之亦然?


对于需要在使用asyncio的代码中使用concurrent.futures Future对象的任何人,可以使用asyncio.wrap_future来包装Future对象,使它们成为可等待对象。 - plafer
2个回答

34

asyncio文档介绍了以下区别:

class asyncio.Future(*, loop=None)

这个类与concurrent.futures.Future几乎兼容。

区别:

  • result()exception() 不接受超时参数,并在Future未完成时引发异常。
  • 使用add_done_callback()注册的回调始终通过事件循环的call_soon_threadsafe()调用。
  • 这个类不兼容concurrent.futures包中的wait()as_completed()函数。

这个类不是线程安全的。

基本上,如果您正在使用ThreadPoolExecutorProcessPoolExecutor,或者希望直接使用Future进行基于线程或进程的并发,请使用concurrent.futures.Future。 如果您正在使用asyncio,请使用asyncio.Future


2
那么除非您使用 add_done_callback(),否则它不是线程安全的? - sargas
7
asyncio.Future 完全不是线程安全的,它只设计为在单线程的 asyncio 应用程序中使用。如果你想从事件循环线程之外的线程调用 asyncio.Future 上的方法,你需要使用 loop.call_soon_threadsafe - dano

4

来自文档

asyncio提供的Future类与concurrent.futures模块中的一致,但适用于事件循环。


这是否意味着它们具有重复的功能? - sargas
1
是的,请参考asyncio.futures.Future的文档字符串。 - chepner
谢谢,我阅读文档字符串的次数越多,差异就变得越清晰。 - sargas
我发现concurrent.futures比asyncio更加方便。 - jbuddy_13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接