concurrent.futures.as_completed如何工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了concurrent.futures.as_completed如何工作?相关的知识,希望对你有一定的参考价值。

我正在学习python并发性,并且我介绍了期货的概念。我读到as_completed()采用了可迭代的期货,并在完成后收益。

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

那么这个功能背后的魔力是什么?

谢谢!

答案

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

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

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

是的,来自documented interfaceimplementation

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