0%

FastAPI自学教程(83) - 多工作进程部署指南

1.基础用法

1
2
3
4
5
# 使用FastAPI CLI启动4个工作进程
fastapi run --workers 4 main.py

# 或直接使用Uvicorn命令
uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
  • --workers参数指定进程数量,建议设置为CPU核心数的1-2倍
  • 启动日志显示父进程管理多个子进程,例如:
    1
    2
    3
    INFO: Started parent process [27365]
    INFO: Started server process [27368]
    INFO: Started server process [27369]
  • 流程图展示多进程架构:
    graph TD
      A[客户端请求] --> B[Gunicorn主进程]
      B --> C[Uvicorn Worker1]
      B --> D[Uvicorn Worker2]
      B --> E[Uvicorn Worker3]
      C & D & E --> F[FastAPI应用]

2.核心组件协作

2.1 Gunicorn与Uvicorn关系

  • Gunicorn作为进程管理器,负责端口监听和请求分发
  • Uvicorn Worker处理ASGI协议,执行FastAPI应用逻辑
  • 协作优势:
    • 利用多核CPU并行处理请求
    • 隔离单个进程崩溃影响
    • 支持动态扩容缩容

2.2 生产环境配置建议

1
2
# 推荐Docker部署配置
gunicorn main:app -k uvicorn.workers.UvicornWorker -w 8 --timeout 120
  • 重要参数说明:
    参数 作用 推荐值
    -w Worker数量 CPU核心数×2
    –timeout 请求超时时间 120秒
    –log-level 日志级别 warning

3.生产环境优化

  1. 性能调优
    • 禁用调试模式(--no-debug)和自动重载(--no-reload
    • 使用Redis连接池替代单数据库连接
  2. 健康检查
    1
    2
    3
    4
    5
    # Kubernetes配置示例
    livenessProbe:
    httpGet:
    path: /health
    port: 8000
  3. 资源限制
    1
    2
    # 使用cgroups限制内存
    systemd-run --scope -p MemoryLimit=2G uvicorn main:app
  4. 日志管理
    • 配置JSON格式日志方便ELK收集
    • 分离访问日志与错误日志

4.注意事项

  1. 信号处理
    • 父进程收到SIGTERM会优雅关闭所有Worker
    • 使用kill -TERM <父进程ID>进行安全关闭
  2. 版本兼容
    • FastAPI 0.68+ 需要Uvicorn 0.13+
    • 避免直接指定Starlette版本
  3. 容器部署
    1
    2
    # 官方推荐基础镜像
    FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9

测试命令示例:

1
2
3
4
5
# 查看进程树
pstree -p | grep uvicorn

# 压力测试
wrk -t4 -c100 -d30s http://localhost:8000/