为什么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
相关产品推荐
相关产品推荐

