一、使用 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
网友回复