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

asyncio.ensure_future与create_task的区别及适用场景解析

asyncio.ensure_future 与 create_task 的使用场景及区别

核心差异与适用场景

  • asyncio.create_task():Python 3.7起新增的官方推荐API,语义明确,专门用来创建Task。它仅接受可等待对象(比如async定义的协程),会自动将协程包装成Task并加入当前事件循环调度。
    • 适用时机:当你明确要把协程转为后台并发任务,且运行环境是Python 3.7及以上版本时,优先用它。
  • asyncio.ensure_future():兼容性更强的老API(支持Python 3.4+),功能更宽泛——它不仅能处理协程,还能直接返回传入的Future或Task对象:
    • 若传入协程,会自动包装为Task;
    • 若传入的已经是Future/Task,直接返回原对象。
    • 适用时机:需要处理协程、Future、Task混合类型的对象,或者要兼容Python 3.7之前的版本时,才考虑使用。

代码示例

使用 asyncio.ensure_future 的实现

async def run(r):
    url = "http://localhost:8080/{}"
    tasks = []

    # 在同一个Client会话中获取所有响应,保持连接复用
    async with ClientSession() as session:
        for i in range(r):
            task = asyncio.ensure_future(fetch(url.format(i), session))
            tasks.append(task)

        responses = await asyncio.gather(*tasks)
        # 所有响应体都存储在这个变量中
        print(responses)

使用 asyncio.create_task 的实现

async def get_all(*names: str):
    started_at = time.time()

    # 创建任务,同时发起所有请求以实现并发
    tasks = [asyncio.create_task(get_pokemon(name)) for name in names]

    # 等待所有任务执行完成
    results = await asyncio.gather(*tasks)

    for result in results:
        if result:
            pokemon = parse_pokemon(result)
            print(f"💁 {pokemon.name} 的属性为 {','.join(pokemon.types)}")
        else:
            print(f"❌ 未找到对应数据...")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:21:02