FastAPI ——异步并发,async / await

📅 2026/7/14 4:54:17
FastAPI ——异步并发,async / await
本文基于 FastAPI 官方文档https://fastapi.org.cn/整理。一、核心概念异步、并发、并行1. 什么是异步代码异步代码的意思是程序执行到某一点时告诉计算机我要等外面的某样东西完成比如慢文件、慢网络。在等待的这段时间计算机不是干等着而是去处理别的工作等那个慢任务好了再回来取结果继续干。等待外面通常指相对于 CPU/内存速度来说很慢的I/O 操作客户端通过网络发数据 / 程序通过网络收数据系统从磁盘读文件 / 程序把内容写回磁盘调用远程 API数据库查询返回结果因为时间主要耗在等 I/O上这类操作叫I/O 密集型。“异步的反义词是同步”也叫顺序——同步就是必须一步步按顺序走哪怕中间在等也不切去干别的。2. 并发 vs 并行汉堡故事 并发汉堡异步你和心仪的对象去吃快餐。收银员处理前面客人订单时你在排队轮到你点了两份精致汉堡付了款收银员给你一个取餐号。拿着号码你们找张桌子坐下聊天。等餐期间你不是干坐着——你忙着欣赏对方有多棒、可爱、聪明时不时抬头看一眼柜台显示屏上的号码。终于轮到你们了你去取餐、回到桌边愉快开吃。你的角色就是计算机/程序在等待汉堡慢 I/O的这段时间里你把注意力切换去做别的事聊天等汉堡好了的信号出现再温和地结束当前话题、走过去取餐、继续后续逻辑。你不必在柜台前死守。 并行汉堡同步换个店8 个兼任厨师的收银员前面的人得等汉堡做好才离开柜台。轮到你点餐、付款然后你站在柜台前死守因为没有取餐号——你得防止别人抢走你的汉堡。你和对象全程忙着盯餐根本没空交流。这是同步工作你和收银员同步必须守在那儿等结果。即使店里有多位收银员多处理器体验依然很差。结论并发 等待期间去干别的适合大量等待的场景。并行 多个人同时干活适合大量实际计算的场景。二者不同不是谁更好。但 Web 应用恰恰就是大量等待——服务器大部分时间在等客户端发请求、等响应返回所以异步对 Web API 意义重大。这也是 NodeJS 火的原因FastAPI 基于 Starlette性能能跟 Go 叫板。3. CPU 密集型怎么办如果是打扫大房子这种没有等待、只有纯干活的任务音频/图像处理、计算机视觉、机器学习、深度学习轮换并发没用因为没东西可等。这时候要并行——多开几个进程一起干。好消息FastAPI 既能用异步处理 Web 常见的并发又能用多进程/多处理处理 CPU 密集型的并行比如机器学习推理。加上 Python 本身就是数据科学/ML 第一语言所以 FastAPI 特别适合做 ML 的 Web API。二、async与await怎么写现代 Python 用非常直观的方式写异步看起来就跟顺序代码一样# 关键点await —— 告诉 Python 先等 get_burgers 干完再赋值burgersawaitget_burgers(2)# 支持 await 的函数必须用 async def 声明asyncdefget_burgers(number:int):# 做一些异步操作returnburgers# 这是同步函数不支持 awaitdefget_sequential_burgers(number:int):# 顺序执行returnburgers规则很死await只能写在async def函数里。async def函数必须被await才能调用。所以async def函数也只能在async def函数内部调用。“第一个 async 函数谁调用”——用 FastAPI 你不用操心那个第一个就是你的路径操作函数FastAPI 帮你处理。典型用法app.get(/burgers)asyncdefread_burgers():burgersawaitget_burger(2)returnburgers三、一图总结要不要调需要 await 的库 ├── 是 → async def └── 否 → 还要不要跟外部DB/API/文件通信等待 ├── 不需要等待 → async def └── 需要等待且库不支持 await → def 拿不准 → def最稳参考来源FastAPI 官方文档「并发与 async / await」https://fastapi.org.cn/async/