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

Python Flask服务无法并行执行所有函数调用 如何实现请求无等待处理

问题解决方案

核心原因

  • WSGI服务器默认并发配置不足:你当前使用的Waitress服务器默认线程数较低,无法支撑多个并行请求的处理,后续请求会进入队列等待前序请求释放线程资源。
  • CPU密集型任务放大阻塞效应:你代码中的doSomeHeavyWork是纯CPU占用的死循环任务,Python的全局解释器锁(GIL)会导致同进程内的多线程在执行CPU密集任务时互相抢占资源,进一步拉长了后续请求的等待时间。
  • 重复IO操作冗余:每次请求都重复读取15MB的本地CSV文件,额外增加了IO耗时和资源占用。

解决方案

1. 调整Waitress并发配置

直接在启动Waitress时增加线程数参数,提升并行处理能力:

serve(app, host="0.0.0.0", port=5002, threads=10)

可以根据你的实际请求量级调整threads数值,常规场景设置为10~20即可满足需求。

2. 更换为多进程WSGI服务器(适合CPU密集场景)

如果你的业务以CPU密集型计算为主,建议使用支持多进程的Gunicorn服务器,规避GIL带来的多线程性能限制:

  • 首先安装Gunicorn:pip install gunicorn
  • 启动命令示例:
gunicorn -w 4 -t 120 -b 0.0.0.0:5002 app:app

其中-w 4代表启动4个工作进程,一般推荐设置为服务器CPU核心数的2倍左右;-t 120设置请求超时时间为120秒,适配你的长耗时任务。

3. 优化冗余IO操作

将CSV文件预加载到内存,避免每次请求重复读取:

from flask import Flask
from waitress import serve
import datetime
import pandas as pd

app = Flask(__name__)
# 服务启动时预加载文件,仅读一次
file_path = "D:\\15MB_Data.csv"
data_frame = pd.read_csv(file_path, ",")

@app.route("/get_data/")
def get_data():
    print("Request received at: " + str(datetime.datetime.now()))
    t1 = datetime.datetime.now()
    # 直接使用内存中的data_frame,无需重复读文件
    print("Starting processing at: " + str(datetime.datetime.now()))
    doSomeHeavyWork()

    t2 = datetime.datetime.now()
    init_time = 'Time in Initialization : ' + str((t2 - t1)) + ". Completed at " + str(datetime.datetime.now())
    print(init_time)
    return init_time

def doSomeHeavyWork():
    current_time_plus5 = datetime.datetime.now() + datetime.timedelta(0, 5)
    while datetime.datetime.now() < current_time_plus5:
        i = 0
    return 1

serve(app, host="0.0.0.0", port=5002, threads=10)

4. Nginx部署补充配置

如果使用Nginx反向代理,需要确保Nginx没有开启请求限速或者连接队列限制,常规配置即可支持多请求并行转发,核心问题还是在于后端Flask服务的并发配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:24:03