事件循环介绍

事件循环(Event Loop)的"电梯"比喻

把单线程 CPU 想成一部只载一人的电梯

  • 电梯里一次只能运行一个人(同步函数)
  • 但大楼里 1000 个人都要去不同楼层(I/O 操作:网络、文件、数据库 ...)
  • 如果每个人"自己开电梯"→ 电梯空跑、人堵门口,效率极低

事件循环就是**"电梯调度员"**:

  1. 把整栋楼的所有"上下楼请求"登记到一张任务清单
  2. 电梯每次只拉一个"能立刻出发"的人
  3. 当某人按下"去 15 楼"按钮后,电梯不会傻等他走到 15 楼再回来 ,而是
    • 把"到达 15 楼后的事"写进清单(回调 / Future)
    • 立刻拉下一位就绪的人
  4. 15 楼按钮亮起(I/O 完成)→ 调度员再把"后续任务"重新塞进电梯

结果:一部电梯(单线程)在任意时刻都载着"就绪"的人 , 而"等人"的时间被拿去干别的事,宏观上 1000 个人同时移动------这就是并发。


技术映射

比喻 真实术语
任务清单 就绪队列(ready queue)
电梯 线程(主线程)
按钮亮起 内核 epoll/select 返回可读/可写事件
到达后的事 回调、协程 resume、Future.set_result()
调度员 事件循环对象 (asyncio.get_event_loop())

为什么能"异步"又"并发"

  1. 异步

    调用 await sock.recv(1024) 时,协程把"剩余代码"封装成回调挂到事件循环,

    主线程立刻去执行下一个就绪任务;

    当 socket 缓冲区收到数据 → 事件循环把回调重新推进就绪队列 → 协程恢复。

    因此调用者不会阻塞在 recv 上,形成"非阻塞"效果。

  2. 并发

    单线程同一时刻只能跑一条 CPU 指令,

    但 I/O 操作 99 % 时间都在等网卡、等磁盘、等数据库响应

    事件循环把这些"空闲时间"切片,让成千上万个协程轮流占用 CPU

    从宏观时间轴看,它们像是"同时"进行,于是实现了高并发


一张图秒懂

lua 复制代码
        主线程(单核)
┌──────────────────────────────┐
│ while True:                  │
│     ① 将就绪协程推进电梯      │←---┐
│     ② 运行直到遇到 I/O        │    │
│     ③ 把"后续"注册到内核 + 循环 │    │
│     ④ 内核 epoll 通知完成     │----┘
└──────────────────────────────┘

电梯永远满载,但从不等人,吞吐量 ↑↑


结论

事件循环不是魔法,只是把**"等 I/O 的时间"转化为 "运行其他任务的时间"
在单线程里让
大量 I/O 密集任务交替推进**,

既避免了多线程切换开销,又达到近乎线性的并发能力 ------

这就是它成为 Node.js、Python asyncio、FastAPI 灵魂的原因。

相关推荐
云和数据.ChenGuang3 小时前
fastapi的参数剖析
人工智能·深度学习·机器学习·语言模型·状态模式·fastapi
Python私教1 天前
API 输出模型怎么设计:从 model_dump() 到显式展示层
python·fastapi
Python私教1 天前
本地 AI 工具服务该绑定 127.0.0.1 还是 0.0.0.0?
python·fastapi
weixin_471383031 天前
08 Chroma 持久化 + FastAPI 封装
fastapi·chroma
京东云开发者2 天前
【全栈实践】第一个 AI Agent 项目:从零搭建 AI 音频创作助手(进阶篇)
typescript·fastapi·vuex
云和数据.ChenGuang2 天前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
燐妤2 天前
中老年智能健康管理项目
python·ai·pycharm·vue3·fastapi·项目开发·健康
circuitsosk3 天前
构建高可用AI后端服务:REST API设计、数据库交互及异步任务编排经验总结
数据库·人工智能·python·交互·fastapi·数据库连接池·rest api
java1234_小锋3 天前
【免费】基于Python的微信小程序网约车(打车,在线叫车,移动出行)系统(FastAPI+Vue3) 锋哥原创出品,必属精品
微信小程序·小程序·fastapi·网约车系统·在线叫车系统
卷无止境3 天前
用 FastAPI 撑起大文件的上传下载:从流式处理到断点续传的完整实践
后端·python·fastapi