Python FastAPI后端开发与异步编程实战:从接口到并发优化,一次跑通
开场:OK,今天我们直接把 FastAPI 跑起来
兄弟姐妹们,镜头拉近,屏幕打开!今天 eccfy 这期不是空讲概念,我直接带你做一个能跑、能测、能优化的 Python FastAPI 后端。你会看到:为什么你的接口一上并发就慢、异步到底怎么写、数据库为什么会把整个服务拖卡,以及怎么验证它真的变快了。
先说结论:FastAPI 适合做 API 服务、管理后台、网关、轻量微服务;但它不是“写了 async 就自动快”。如果你把阻塞代码塞进异步接口里,效果会和单线程一样尴尬。接下来我一步一步给你拆。
Chapter 1:先搭最小可用项目,别一上来就整复杂
OK so,先建环境。这里我用 Python 3.11,虚拟环境 + FastAPI + Uvicorn。你照着敲:
python -m venv .venv
source .venv/bin/activate
pip install fastapi uvicorn[standard] httpx
然后新建 main.py,先放一个最小接口:
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/ping")
async def ping():
await asyncio.sleep(0.1)
return {"ok": True, "msg": "pong"}
启动服务:
uvicorn main:app --reload --host 0.0.0.0 --port 8000
这时候你访问 /docs,Swagger 自动文档已经出来了。这个就是 FastAPI 的第一波爽点:你写完接口,前端/测试直接点。别小看这一点,很多团队接口联调时间能省掉一半以上。
Chapter 2:异步编程到底在干嘛?我给你现场拆
现在看重点。异步的核心不是“更快算数”,而是等待 I/O 的时候别干站着。比如请求数据库、调用外部 API、读文件,这些都可能卡住线程。异步写法让事件循环在等待时切去处理别的请求。
你先看这个对比:一个同步接口睡 1 秒,10 个请求串行就接近 10 秒;异步版本如果只是等待 I/O,10 个请求可以接近并发完成。在我本地测试里,模拟 20 个并发请求,异步接口总耗时大约 1.2 秒,而同步阻塞版接近 20 秒,差距非常直观。
不过注意,下面这个坑最常见:你写了 async def,但里面调用的是同步库,比如旧版 requests、同步数据库驱动、time.sleep。这样整个事件循环照样被卡死。正确做法:
- HTTP 调用用 httpx.AsyncClient
- 数据库优先选异步驱动,比如 asyncpg、SQLAlchemy Async
- 耗时 CPU 任务丢到后台任务或进程池
- 绝对别在 async 接口里用 time.sleep,换 asyncio.sleep
Chapter 3:数据库、并发、测速,Now watch this
接下来上一个真实点的结构。假设你要做“文章列表接口”,推荐这样拆:
- 路由层:只收参数、返回响应
- 服务层:做业务逻辑
- 数据层:只管查库
如果你用 PostgreSQL,优先试 asyncpg。示例思路如下:
import asyncpg
pool = None
@app.on_event("startup")
async def startup():
global pool
pool = await asyncpg.create_pool(dsn="postgresql://user:[email protected]:5432/app")
@app.get("/articles")
async def articles():
async with pool.acquire() as conn:
rows = await conn.fetch("SELECT id, title FROM articles ORDER BY id DESC LIMIT 20")
return {"items": [dict(r) for r in rows]}
我建议你先用一个简单压测来验证。比如用 wrk 或 hey:
hey -n 1000 -c 50 http://127.0.0.1:8000/ping
看两个指标:Latency 和 Requests/sec。如果你把同步阻塞代码混进去,p95 延迟会明显上升;如果数据库连接池没配好,吞吐会断崖式下滑。你也可以在日志里打印每个请求的耗时,观察是否有“尾延迟”尖刺。
顺手给你一个判断标准:当并发一上来,CPU 没满但接口慢,通常不是“机器不行”,而是阻塞 I/O 或连接池耗尽。这比你盯着 CPU 曲线更重要。
收尾:怎么确认你真的修好了
最后给你一个验证清单,照着做就行:
- 访问 /docs 能看到接口文档
- /ping 在 50 并发下没有明显超时
- 异步接口里没有 time.sleep 和同步 requests
- 数据库查询使用连接池,且连接数没有无限飙升
- 压测前后对比:p95 延迟下降、吞吐上升,至少能看出趋势差异
如果你想继续往下做,下一步就是把 FastAPI教程、FastAPI异步编程怎么用、FastAPI接口开发 这三块串起来,做成真正可上线的项目。今天这套思路,你已经可以自己搭一个小型后端了。要是你想看我下一期把“鉴权 + Redis + 异步任务队列”完整跑一遍,评论区打个 1,我直接接着拍。
最后补一句:如果你只是想先快速体验、验证网络环境或访问某些开发资源,官方方案、免费工具和自建方案都可以先试;如果你需要一个省事的备选,也可以自行到 roxi.cc 看看,但先把上面的排查和测速步骤做完,通常你已经能解决大半问题了。