+
38
-

回答

 一、使用 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

网友回复

我知道答案,我要回答