一、使用 Uvicorn 的多进程 + 多线程模式
启动多个工作进程(Workers)
FastAPI 是基于 ASGI 的异步框架,默认只运行在单个进程中。你可以通过指定 --workers 参数启动多个进程以利用多核 CPU:
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
--workers 4 表示启动 4 个 Uvicorn 工作进程;
通常建议设置为 CPU 核心数(或核心数 × 2);
注意:如果你的应用依赖全局状态(如内存缓存),请谨慎使用多进程。
使用 --loop 设置高效的事件循环(推荐使用 uvloop)
Uvicorn 支持多种事件循环实现,其中 uvloop 是最快的选择之一:
pip install uvloop
然后启动时指定:
uvicorn main:app --host 0.0.0.0 --port 8000 --loop uvloop
uvloop 是 asyncio 的高性能替代实现,性能可提升 2~3 倍。
二、合理使用异步与同步函数
FastAPI 支持异步编程模型,但只有在正确使用时才能发挥优势。
异步视图函数(async def)
如果你的接口调用了数据库、外部 API 等 I/O 密集型操作,请使用 async def 定义路由函数:
@app.get("/items/")
async def read_items():
data = await async_db_query()
return data 这样可以让事件循环调度其他任务,而不是阻塞整个进程。
避免在异步函数中执行耗时同步操作
如果你在 async def 函数中执行了大量 CPU 计算、长时间的同步操作(如 PIL 图像处理),会阻塞整个事件循环。
此时应该:
使用 concurrent.futures.ThreadPoolExecutor 或 ProcessPoolExecutor
或者直接定义为普通函数(不加 async)
三、配合反向代理(Nginx / Traefik)做负载均衡
使用 Nginx 做前端反向代理和负载均衡
你可以在多个端口启动多个 FastAPI 实例,再通过 Nginx 做负载均衡:
示例:启动多个实例uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2 & uvicorn main:app --host 0.0.0.0 --port 8001 --workers 2 &Nginx 配置示例
upstream fastapi_servers {
least_conn;
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
server {
listen 80;
location / {
proxy_pass http://fastapi_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
} 这可以进一步提升整体并发吞吐量。
四、优化数据库访问(ORM 性能)
FastAPI 自身并不限制性能瓶颈,往往是数据库成为瓶颈。
使用异步 ORM(如 SQLAlchemy Core + asyncpg / aiomysql)
pip install sqlalchemy databases asyncpg
from databases import Database
from fastapi import Depends
database = Database("postgresql+asyncpg://user:password@localhost/dbname")
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
@app.get("/users/")
async def read_users():
query = "SELECT * FROM users"
return await database.fetch_all(query)如果你使用的是同步 ORM(如 SQLAlchemy ORM),考虑封装到线程池中避免阻塞事件循环。
五、启用 Gunicorn + Uvicorn Worker 组合部署
对于生产环境,更推荐使用 Gunicorn + Uvicorn workers 的组合方式部署,支持更好的配置管理与进程管理。
安装依赖
pip install gunicorn uvicorn
启动命令
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
-w 4:启动 4 个工作进程;
-k uvicorn.workers.UvicornWorker:使用 Uvicorn 的 Gunicorn worker;
main:app:你的 FastAPI 实例;
更高级的部署方案还可以结合 Docker + Kubernetes + Redis + PostgreSQL 连接池 + 负载均衡器 来构建高并发系统。
六、压力测试工具推荐
使用以下工具对你的 FastAPI 接口进行压测:
✅ Apache Bench (ab)
ab -n 1000 -c 100 http://localhost:8000/items/
✅ Locust
pip install locust
创建 locustfile.py 并运行:
locust -f locustfile.py
网友回复
如何让ai帮我自动在小红书或抖音上自动根据需求截流与潜在客户聊天拉客?
如果用go编写一个在virtualbox中启动的简单操作系统?
go如何搭建一个零信任网络?
如何用python实现一个公网代理访问软件?
如何用go实现一个公网代理访问软件?
如何用python实现一个内网穿透打洞程序,实现内网的80端口暴露到公网上可以访问?
如何用go实现一个内网穿透打洞程序,实现内网的80端口暴露到公网上可以访问?
何为Shadowsocks 代理?
python如何实现类似php的opendir目录相互隔离的fastcgi多租户虚拟空间?
nodejs如何实现类似php的opendir目录相互隔离的fastcgi多租户虚拟空间?


