【问题标题】: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 interfaceimplementation 都是如此。

    【讨论】:

    • 不错的编辑...想知道原文中的回调。
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 2016-11-13
    • 2017-10-11
    • 2021-10-13
    • 2011-02-24
    • 2013-11-16
    • 2011-10-16
    • 2012-11-03
    相关资源
    最近更新 更多