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

为何Python中我的asyncio任务无法并发执行?

Asyncio任务顺序执行而非并发的问题解决

你的问题出在连续使用await调用协函数——每次await都会暂停当前协程,直到被调用的协函数执行完毕才会继续下一行代码。所以say_after(2, 'hello')会先跑满2秒,之后才会启动say_after(1, 'world'),总耗时自然是2+1=3秒。

要实现并发,你需要先把协函数包装成任务(Task)让asyncio调度器同时管理,再等待所有任务完成。这里有两种常用方法:

方法1:使用asyncio.create_task

先创建任务对象,让调度器立即开始执行,之后再等待任务结束:

import asyncio
import time

async def say_after(delay, message):
    await asyncio.sleep(delay)
    print(message)

async def main():
    print(f"started at {time.strftime('%X')}")

    # 创建任务并立即调度
    task1 = asyncio.create_task(say_after(2, 'hello'))
    task2 = asyncio.create_task(say_after(1, 'world'))

    # 等待两个任务完成
    await task1
    await task2

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

方法2:使用asyncio.gather

一次性收集多个协函数,让它们并发执行,再等待所有完成:

import asyncio
import time

async def say_after(delay, message):
    await asyncio.sleep(delay)
    print(message)

async def main():
    print(f"started at {time.strftime('%X')}")

    # 并发运行多个协程
    await asyncio.gather(
        say_after(2, 'hello'),
        say_after(1, 'world')
    )

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

这两种写法的效果一致:两个任务会同时启动,world会在1秒后先打印,hello在2秒后打印,总耗时约2秒,符合你的预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:32:35