Python Asyncio异步create函数下Future行为异常的原因咨询
为什么异步版
create函数会导致main不等待Future完成? 代码1(create为同步函数)
from asyncio import Future import asyncio async def plan_fut(future_obj): print('future started') await asyncio.sleep(1) future_obj.set_result('Future completes') def create() -> Future: future_obj = Future() asyncio.create_task(plan_fut(future_obj)) return future_obj async def main(): future_obj = create() result = await future_obj print(result) asyncio.run(main())
运行结果:
future started Future completes
代码2(create改为异步函数)
仅修改create函数为异步版本,其余代码与代码1一致:
async def create() -> Future: future_obj = Future() asyncio.create_task(plan_fut(future_obj)) return future_obj
运行结果:
<Future pending> future started
问题解释
核心差异来自两个关键点:
异步函数的执行逻辑
异步函数直接调用时不会执行内部代码,只会返回一个协程对象。代码2中,main里的await future_obj是等待create协程执行完毕——create内部创建Future、提交plan_fut任务后,就直接返回这个未完成的Future(此时plan_fut刚启动,还在等sleep(1)结束,没调用set_result)。事件循环的终止时机
当main执行完print(result)后,整个主协程就结束了,asyncio.run()会立刻关闭事件循环。此时plan_fut可能刚打印完future started,还没走到设置Future结果的步骤,事件循环就终止了,导致这个Future永远无法完成,程序自然不会输出Future completes。
而代码1中,create是同步函数,调用后直接返回Future对象,main里的await future_obj会让事件循环持续运行,直到这个Future被plan_fut设置结果,所以整个流程能顺利完成。
内容的提问来源于stack exchange,提问作者Pramod
相关产品推荐
相关产品推荐

