Flask+Waitress服务器连接数耗尽问题及连接复用方案咨询
问题:Flask+Waitress服务器连接耗尽,Unity端请求异常突出
我使用Python Flask搭配Waitress运行服务器,启动代码如下:
from flask import Flask, render_template, request from waitress import serve @app.route("/get") def first_method(): ... @app.route("/second") def second_method(): ... app = Flask(__name__) app.static_folder = 'static' serve(app, host="ip_address", port=8080)
通过网页和Unity两种方式调用服务器:
- 网页端使用jQuery发起GET请求:
$.get("/get", { variable1: data1, variable2: data2 }).done(function (data) { ... }
- Unity端请求格式:
http://ip_address/get?msg=data1?data2
运行一段时间后服务器抛出错误:total open connections reached the connection limit, no longer accepting new connections,Unity端该问题尤为明显。推测每次GET请求都会新建连接,希望实现连接复用解决问题。
解决方案
1. 调整Waitress连接配置
Waitress默认连接限制较低,启动时可通过参数扩大连接池并开启长连接支持:
serve( app, host="ip_address", port=8080, connection_limit=1000, # 按需提高最大连接数,依据服务器硬件配置调整 keepalive=30, # 设置长连接超时时间(秒),允许客户端复用连接 threads=4 # 匹配服务器CPU核心数调整工作线程,提升并发处理能力 )
connection_limit:直接提升允许的最大连接数,避免快速耗尽keepalive:启用HTTP长连接,让同一客户端的多个请求复用单个连接threads:增加工作线程,减少因线程阻塞导致的连接占用
2. 修复Unity端请求问题
Unity端不仅URL格式错误,默认请求也未启用长连接,需做以下调整:
修正URL参数格式
URL中参数需用&分隔,而非多个?:
http://ip_address/get?msg=data1¶m2=data2
启用长连接
在UnityWebRequest中显式设置Connection头:
using UnityEngine; using UnityEngine.Networking; IEnumerator SendReusableRequest() { using (UnityWebRequest request = UnityWebRequest.Get("http://ip_address/get?msg=data1¶m2=data2")) { request.SetRequestHeader("Connection", "keep-alive"); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.Log(request.error); } else { Debug.Log(request.downloadHandler.text); } } }
复用请求对象
频繁请求时,不要每次新建UnityWebRequest实例,可维护一个请求对象池,重复使用已建立的连接。
3. 排查连接未释放根源
- 确保Flask视图函数无长时间阻塞操作,同步执行耗时任务会占用连接无法释放。如有耗时逻辑,改用异步处理(如Flask异步视图、Celery任务队列)。
- 检查Unity端是否正确释放请求资源,必须用
using语句包裹UnityWebRequest或手动调用Dispose(),避免连接泄漏。
4. 启用HTTP/2(可选)
HTTP/2原生支持多路复用,同一连接可同时处理多个请求,大幅降低连接数消耗:
# 先安装依赖:pip install h2 serve( app, host="ip_address", port=8080, http2=True, connection_limit=1000 )
Unity 2020及以上版本支持HTTP/2,需在PlayerSettings中启用「Allow HTTP/2」选项。
内容的提问来源于stack exchange,提问作者BlackHawk
相关产品推荐
相关产品推荐

