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

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&param2=data2

启用长连接

在UnityWebRequest中显式设置Connection头:

using UnityEngine;
using UnityEngine.Networking;

IEnumerator SendReusableRequest()
{
    using (UnityWebRequest request = UnityWebRequest.Get("http://ip_address/get?msg=data1&param2=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:15:31