asyncio里面的await理解

这5个await不是"5个独立任务",而是同一个协程里的5个"暂停点";只有用create_task()创建出来的才是独立任务,事件循环才会在它们之间切换调度。

🔑 核心区分:await是暂停点,create_task()才是创建任务

  • 情况一:串行await(不是并发)
    如果在一个协程里顺序写5个await,事件循环会一个一个按顺序执行 ,前一个完成后才执行下一个,这本质上还是串行的:

    python 复制代码
    async def main():
        result1 = await task_a()  # 等task_a完成,才往下走
        result2 = await task_b()  # 等task_b完成,才往下走
        result3 = await task_c()
        result4 = await task_d()
        result5 = await task_e()
  • 情况二:用create_task()创建5个独立任务(真正的并发)
    这才是你描述的场景。事件循环会同时启动这5个任务,谁先完成就先拿到谁的结果:

    python 复制代码
    async def main():
        t1 = asyncio.create_task(task_a())
        t2 = asyncio.create_task(task_b())
        t3 = asyncio.create_task(task_c())
        t4 = asyncio.create_task(task_d())
        t5 = asyncio.create_task(task_e())
        
        # 5个任务同时在跑,谁先完成谁先返回
        r1 = await t1
        r2 = await t2
        # ...

⚙️ 事件循环的调度过程

以5个独立任务为例,事件循环的调度流程如下:

  1. 5个任务被注册到事件循环的就绪队列
  2. 事件循环取出任务A开始执行,遇到await(比如网络请求),任务A暂停,进入等待队列
  3. 事件循环取出任务B开始执行,遇到await,任务B也暂停
  4. 依次类推,5个任务都暂停在各自的await处
  5. 此时事件循环监听I/O事件,哪个任务的I/O先完成(比如某个HTTP请求先返回了),就把那个任务移回就绪队列
  6. 事件循环恢复那个任务,从await的下一行继续执行

核心总结 :不是事件循环"安排顺序",而是谁先完成谁先被恢复,完全取决于I/O操作的实际完成时间。

📦 收集结果的三种方式

  • asyncio.gather() :等所有任务完成,按传入顺序返回结果列表(不管实际完成顺序)
  • asyncio.wait():更灵活,可以设置"第一个完成就返回"或"全部完成才返回"
  • asyncio.as_completed() :谁先完成就先拿到谁的结果,按完成顺序返回
python 复制代码
# 按完成顺序拿结果(最符合你的描述)
for coro in asyncio.as_completed([task_a(), task_b(), task_c(), task_d(), task_e()]):
    result = await coro
    print(f"拿到结果: {result}")  # 先完成的先打印

📌 一句话总结

await是"暂停点",create_task()是"创建独立任务",事件循环是"调度员"------它不安排顺序,而是谁先完成就先处理谁。


相关推荐
GIS数据转换器39 分钟前
地下空间综合管廊运营管理平台
大数据·开发语言·人工智能·经验分享·perl
Wang's Blog6 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
信誓旦旦的程序猿6 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河6 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年6 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym7 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
DongQiShanRen7 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室7 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
CCblandy7 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
quantdash_cc7 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash