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
相关产品推荐
相关产品推荐

