concurrent.futures.as_completed 是如何工作的?

Posted

技术标签:

【中文标题】concurrent.futures.as_completed 是如何工作的?【英文标题】:How does concurrent.futures.as_completed work? 【发布时间】:2018-12-16 18:23:08 【问题描述】:

我正在学习 python 并发性,并且向我介绍了期货的概念。我读到as_completed() 需要一个可迭代的期货并在它们完成时生成它们。

我想知道它在内部是如何工作的。它是否立即产生已完成的任务(期货)?一种天真的方法是迭代所有未来并使用done() 检查每个未来,但这是低效的。

那么这个函数背后的魔力是什么?

谢谢!

【问题讨论】:

【参考方案1】:

我想知道它在内部是如何工作的。

as_completed 设置回调以在未来完成时触发,对它收到的所有未来都这样做。 (为此目的,它使用等效于add_done_callback 的内部API。)当任何期货完成时,as_completed 会通过其正在运行的回调来通知。回调在完成未来的任何线程中运行,因此它只设置一个event,由所有回调共享,as_completed 休眠。一旦被事件唤醒,as_completed 立即产生完成的未来。这就是as_completed 确保期货在完成时产生的方式,无论发生的顺序如何。在 yield 之后,事件被清除,并重复等待,直到所有的期货都完成。

它是否立即产生已完成的任务(期货)?

是的,documented interface 和 implementation 都是如此。

【讨论】:

不错的编辑...想知道原文中的回调。

以上是关于concurrent.futures.as_completed 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章