返回笔记
基础概念
Python 异步编程:async/await 从入门到实战
Python
异步
async
await
asyncio
FastAPI
FastAPI 的底层就是 Python 异步编程。理解了 async/await,才能写出高性能的 Web 应用。
同步 vs 异步
同步代码像一个人在收银台:一次只能服务一个顾客,其他人都等着。异步代码像餐厅服务员:点完单就去服务下一桌,厨房做好了再来上菜,不会让任何人干等。
关键概念
- 协程:用 async def 定义的函数,可以暂停和恢复
- 事件循环:调度所有协程的"大管家",决定谁先执行
- await:挂起当前协程,让事件循环去做其他事,等结果回来再继续
基本用法
import asyncio
async def fetch_data():
await asyncio.sleep(1) # 模拟网络请求
return "数据获取完毕"
async def main():
# 并发执行 3 个请求,总耗时约 1 秒,而不是 3 秒
results = await asyncio.gather(
fetch_data(),
fetch_data(),
fetch_data(),
)
print(results)
asyncio.run(main())
在 FastAPI 中的实践
@app.get("/users/{user_id}")
async def get_user(user_id: int):
# async 数据库查询,不阻塞其他请求
user = await db.fetch_one("SELECT * FROM users WHERE id = $1", user_id)
return user
FastAPI 的 async 路由让服务器能同时处理大量请求,而不是一个接一个。
常见坑
- 不要在 async 函数里调同步阻塞代码:会卡死整个事件循环
- CPU 密集型操作用线程池:异步只管 I/O,不管计算
- 记得 await:忘记 await 只会拿到一个 coroutine 对象,不会执行
- 不要在 async 里直接调 requests:用 httpx 或 aiohttp 替代