首页 > 解决方案 > 为什么 python 期货中的 FIRST_COMPLETED 不早点返回?

问题描述

我有这个代码:

from concurrent.futures import ThreadPoolExecutor, wait, as_completed, FIRST_COMPLETED
from time import sleep
from random import randint


def return_after_5_secs(num):
    sleep(randint(1, 5))
    return "Return of {}".format(num)


if __name__ == '__main__':
    pool = ThreadPoolExecutor(5)
    futures = []
    for x in range(5):
        futures.append(pool.submit(return_after_5_secs, x))

    done, not_done = wait(futures, return_when=FIRST_COMPLETED)
    print(f"done: {done}")
    print(f"not_done: {not_done}")
    for f in done:
        print(f.result())

我们可以通过定义何时返回来控制等待函数的行为。我们可以将这些值之一传递给函数的 return_when 参数:FIRST_COMPLETED、FIRST_EXCEPTION 和 ALL_COMPLETED。默认情况下,它设置为 ALL_COMPLETED,因此等待函数仅在所有期货完成时才返回。但是使用该参数,我们可以选择在第一个未来完成或第一个异常遇到时返回。

但为什么我的结果是这样的:

/usr/local/bin/python3.9 /Users/JeffreyWan/python-tutorial/futures/wait.py
done: {<Future at 0x10f1efa90 state=finished returned str>, <Future at 0x10f1efdc0 state=finished returned str>}
not_done: {<Future at 0x10f227130 state=running>, <Future at 0x10f227460 state=running>, <Future at 0x10f2277f0 state=running>}
Return of 0
Return of 1

Process finished with exit code 0

似乎 2 个期货在完成部分。为什么会有...超过1个?

标签: python

解决方案


推荐阅读