FastAPI异步编程完全指南
📂 所属阶段:第二阶段 — 进阶黑科技(核心篇)
🔗 相关章节:FastAPI依赖注入系统 · FastAPI中间件应用
目录
什么是异步编程?
同步vs异步:排队打饭的比喻 🍚
想象你去食堂打饭:
- 同步:你站在窗口等厨师炒完一盘菜,端走,再点下一道。厨师在炒菜时你只能干等。
- 异步:你把菜单交给厨师,然后去拿餐具、倒饮料,等菜好了服务员直接端到你桌上。你不需要傻站着等。
这就是核心区别:等待时是否可以切换去干别的事。
为什么Web服务需要异步?
- 同步模式:按顺序处理,总耗时 = 200 + 1 + 1000 = 1201ms
- 异步模式:A等待数据库时切换B,B完成切C,C等待时切回A → 总耗时≈1000ms
在I/O密集型场景(数据库查询、HTTP请求、文件读写),异步能让单线程处理大量并发请求,显著提升API性能。
异步编程的优势
- 高并发处理能力:单个进程可以处理数千个并发连接
- 资源利用率高:避免线程创建和切换的开销
- 响应速度快:I/O等待期间可以处理其他请求
- 内存占用低:协程比线程占用更少内存
async/await详解
基础语法
await 在等什么?
await 只能等待可等待对象(Awaitable),包括:
asyncio.sleep vs time.sleep
⚠️ 在FastAPI中用
time.sleep()会阻塞整个事件循环!
事件循环原理
什么是事件循环?
事件循环是异步的"调度中心",工作流程:
事件循环生命周期
异步函数调用规则
四条黄金法则
异步中调用耗时同步函数
FastAPI中的异步使用
异步vs同步路由
异步HTTP请求(以httpx为例)
何时使用同步代码
用同步的场景
常见陷阱与避坑指南
陷阱1:忘记await
陷阱2:循环中串行await
实战:构建异步API服务
性能优化建议
- 使用连接池:如
httpx.AsyncClient、asyncpg.create_pool,避免频繁创建销毁连接 - 适当缓存:用
lru_cache缓存同步计算,异步缓存可用asyncio_lru_cache - 避免不必要的串行await:独立任务统一用
asyncio.gather并发执行
总结
💡 记住:异步的核心是处理大量并发I/O请求,但不要在异步函数中做CPU密集计算——那会让整个事件循环卡住。

