concurrent.futures.as_completed如何工作?

问题描述 投票:8回答:1

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

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

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

谢谢!

python multithreading python-3.x concurrency concurrent.futures
1个回答
7
投票

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

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

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

是的,来自documented interfaceimplementation

© www.soinside.com 2019 - 2024. All rights reserved.