You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Python futures的FIRST_COMPLETED参数返回多个已完成任务?

原因说明

这一现象属于符合设计预期的正常表现,核心原因有两点:

  • 多任务并发完成的时间差极短
    你配置的线程池大小为5,5个任务会被同时启动。randint(1,5)有概率生成相同的休眠时间,即便时间不完全相同,只要多个任务的结束时间差小于操作系统线程调度的时间片、Python GIL的切换间隔,就会出现在wait函数触发返回前,多个任务已经完成状态变更的情况。
  • FIRST_COMPLETED的实现逻辑设计
    Python官方文档中FIRST_COMPLETED的定义是「当任意一个future完成、抛出异常或被取消时就返回」,而非「仅返回第一个完成的future、其他完成的任务会被归入未完成集合」。
    wait函数的内部执行逻辑是:先阻塞等待满足返回条件的事件触发,唤醒后会全量扫描所有传入的future状态,将所有已经结束的future统一归入done集合,剩下未结束的才会归入not_done集合,不存在第一个任务完成后立刻打断其他任务状态更新的逻辑。

验证方法

你可以修改任务的休眠时间为梯度值,确认逻辑符合预期:

# 将return_after_5_secs函数的休眠逻辑修改为固定梯度
def return_after_5_secs(num):
    # 第0个任务休眠1秒,其他任务休眠5秒
    sleep(1 if num == 0 else 5)
    return "Return of {}".format(num)

修改后运行代码,done集合中将只会包含1个已完成的future。

内容的提问来源于stack exchange,提问作者Jwan622

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:36:05