【问题标题】:How does concurrent.futures.as_completed work?concurrent.futures.as_completed 是如何工作的?
【发布时间】:2018-12-16 18:23:08
【问题描述】:
我正在学习 python 并发性,并且向我介绍了期货的概念。我读到as_completed() 需要一个可迭代的期货并在它们完成时生成它们。
我想知道它在内部是如何工作的。它是否立即产生已完成的任务(期货)?一种天真的方法是迭代所有未来并使用done() 检查每个未来,但这是低效的。
那么这个函数背后的魔力是什么?
谢谢!
【问题讨论】:
标签:
python
multithreading
python-3.x
concurrency
concurrent.futures
【解决方案1】:
我想知道它在内部是如何工作的。
as_completed 设置回调以在未来完成时触发,对它收到的所有未来都这样做。 (为此目的,它使用等效于add_done_callback 的内部API。)当任何期货完成时,as_completed 会通过其正在运行的回调来通知。回调在完成未来的任何线程中运行,因此它只设置一个event,由所有回调共享,as_completed 休眠。一旦被事件唤醒,as_completed 立即产生完成的未来。这就是as_completed 确保期货在完成时产生的方式,无论发生的顺序如何。在 yield 之后,事件被清除,并重复等待,直到所有的期货都完成。
它是否立即产生已完成的任务(期货)?
是的,documented interface 和 implementation 都是如此。