
但我任务的配置其实是协程,而不是多线程。
在 Gunicorn 中使用 worker_class = 'gevent'
(基于协程的异步 Worker)时,提升并发能力的关键在于 合理配置协程并发数 和 优化资源分配。
以下是具体方法和步骤:
gevent
通过 协程(Coroutine) 和 事件循环(Event Loop) 实现高并发,每个请求由协程处理而非线程或进程。
协程的切换成本极低,因此适用于 I/O 密集型 场景(如 HTTP API、数据库查询、外部服务调用等)。
1. Worker 进程数 (--workers
/workers
)
CPU 核心数 × 2 + 1
。例如 4 核 CPU 可设 workers = 9
。gunicorn --workers=9 --worker-class=gevent app:app
2. 每个 Worker 的并发连接数 (--worker-connections
/worker_connections
)
1000
,可调整为 1000~5000
(需根据内存和负载测试调整)。gunicorn --workers=9 --worker-class=gevent --worker-connections=2000 app:app
3. 超时时间 (--timeout
/timeout
)
--timeout=30
表示 30 秒超时)。1. 通过命令行启动
gunicorn \ --workers=9 \ # Worker 进程数 = CPU核心数 × 2 + 1 --worker-class=gevent \ # 使用 gevent Worker --worker-connections=2000 \ # 每个 Worker 的协程并发数 --timeout=30 \ # 请求超时时间 --bind=0.0.0.0:8000 \ # 绑定端口 app:app # 应用入口
2. 通过配置文件 (gunicorn.conf.py
)
# gunicorn.conf.py workers = 9 worker_class = "gevent" worker_connections = 2000 timeout = 30 bind = "0.0.0.0:8000"
启动命令:
gunicorn -c gunicorn.conf.py app:app
1. 内存限制
worker_connections
) 受内存限制。协程越多,内存占用越高。top
或 htop
观察进程内存,避免触发 OOM(内存不足)。2. I/O 密集型 vs CPU 密集型
worker_connections
。gthread
Worker)。3. 数据库连接池
pool_size
)。4. 依赖库兼容性
gevent
(可能需要 monkey.patch_all()
)。5. 启动前添加补丁:
# app.py 入口文件顶部 from gevent import monkey monkey.patch_all()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。