You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gevent WSGI服务器最大请求处理量及线程引入方法咨询

Gevent WSGI性能与线程使用指南

一、Gevent WSGI每秒最大请求数(QPS)

Gevent WSGI的每秒请求数没有固定上限,完全取决于以下核心因素:

  • 硬件资源:CPU核心数、内存带宽、网络IO能力是基础瓶颈。CPU密集型请求会受限于CPU核心数量,IO密集型请求则更依赖网络延迟和IO等待时间。
  • 请求类型:纯计算类(CPU密集)请求的QPS远低于IO等待类(如数据库查询、第三方API调用),因为Gevent协程会在IO阻塞时自动切换到其他任务。
  • Flask应用逻辑:请求处理中的耗时操作(如复杂数据库查询、大文件读写)会直接拉低整体QPS,优化应用内部逻辑比调整Gevent参数更有效。
  • Gevent配置:默认情况下Gevent会根据CPU核心数自动调整协程数,也可以通过WSGIServer的spawn参数手动指定协程池大小(例如spawn=gevent.pool.Pool(100))。

实际QPS需要通过压测验证,常用工具及命令:

  • 使用wrk:wrk -t4 -c100 -d30s http://你的服务器IP:端口
  • 使用ab:ab -n 1000 -c 100 http://你的服务器IP:端口/
    压测结果中的Requests/sec即为实际每秒处理请求数。

二、在Gevent WSGI中引入线程

Gevent以协程为核心,但也支持结合线程使用,分两种场景:

1. 让WSGIServer用线程池处理请求

通过WSGIServer的spawn参数指定线程池,让服务器用线程处理请求,示例修改你的代码如下:

from gevent.pywsgi import WSGIServer
from gevent.threadpool import ThreadPool
import os
from gevent.server import _tcp_listener

def run(app, port=8889, listener=None):
    if listener is None:
        listener = ('', port)
    # 创建指定大小的线程池
    thread_pool = ThreadPool(20)
    # 配置服务器使用线程池处理请求
    http_server = WSGIServer(listener, app, spawn=thread_pool)
    http_server.serve_forever()

def main():
    listener = _tcp_listener(('0.0.0.0', '80'))
    run(app, None, listener)
    return 0

2. 在Flask请求中使用线程执行后台任务

如果需要在单个请求中异步处理耗时任务(避免阻塞协程),可以结合Python标准库线程,同时需打Gevent猴子补丁优化调度:
首先在app.py开头添加补丁:

from gevent import monkey
monkey.patch_all()

from flask import Flask
app = Flask(__name__)

然后在视图函数中使用线程:

import threading
import time

def background_task():
    time.sleep(5)
    print("后台任务执行完成")

@app.route('/')
def index():
    # 启动后台线程
    thread = threading.Thread(target=background_task)
    thread.daemon = True
    thread.start()
    return "请求已接收,后台任务处理中"

打补丁后,标准库线程会被替换为Gevent绿色线程,不会占用过多OS线程资源,调度效率更高。

内容的提问来源于stack exchange,提问作者Bharath S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:15:55