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 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章