关于Python asyncio.gather中_GatheringFuture结果设置主体的疑问
关于asyncio.gather中_GatheringFuture的结果设置逻辑
你观察到的没错,asyncio.gather返回的_GatheringFuture本身确实没有直接调用set_result()或set_exception()的逻辑,但它的结果/异常是通过子任务的回调机制来触发设置的,具体流程如下:
- 当调用
asyncio.gather(func(1), func(2))时,gather内部会先把传入的协程(或Future/Task)统一包装成可调度的Task实例(如果还不是的话),这些就是源码里的children子任务。 - 创建
_GatheringFuture实例后,gather会给每个子任务添加done_callback(对应源码中的_complete_future函数)。这个回调的作用是:每当一个子任务完成(无论正常返回还是抛出异常),就更新_GatheringFuture内部的结果收集状态。 - 当所有子任务都完成后,回调会根据收集到的结果(或异常,取决于
return_exceptions参数),主动调用_GatheringFuture的set_result()或set_exception()方法:- 若所有子任务正常完成,就把收集到的结果列表传入
set_result(),这就是你await时拿到的[1, 2]; - 若有子任务抛出异常且
return_exceptions为False,就会把第一个异常传入set_exception(),触发await时的异常捕获。
- 若所有子任务正常完成,就把收集到的结果列表传入
简言之,_GatheringFuture是一个“协调者”角色,它不自行执行任务,而是监听所有子任务的完成事件,等全部子任务结束后,由绑定的回调函数帮它完成结果或异常的设置。
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

