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

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

问题解释

核心差异来自两个关键点:

  1. 异步函数的执行逻辑
    异步函数直接调用时不会执行内部代码,只会返回一个协程对象。代码2中,main里的await future_obj是等待create协程执行完毕——create内部创建Future、提交plan_fut任务后,就直接返回这个未完成的Future(此时plan_fut刚启动,还在等sleep(1)结束,没调用set_result)。

  2. 事件循环的终止时机
    当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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:10:34