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

本地Python服务下Ajax请求JSON首次响应耗时过长问题排查

Ajax轮询配置文件首次请求耗时过长问题

首先说明:本人英语表达能力有限,还请谅解。

我在开发中遇到如下技术问题:通过Ajax定时轮询会被外部程序持续覆写的JSON配置文件,数据发生变更后,首次请求需要等待20-30秒才能在前端看到更新效果(最初推测为缓存导致,相关配置见下文);首次请求完成后,后续请求仅需2秒甚至更短即可返回最新数据,若间隔一段时间未发起请求,首次请求耗时过长的问题会再次复现。

我初步判断问题诱因有两种可能:

  • 浏览器缓存机制导致
  • 自行搭建的Python本地HTTP服务存在性能问题

本地Python HTTP服务实现代码

class ServerHandler(http.server.SimpleHTTPRequestHandler):

 
    def do_GET(self):
        logging.error(self.headers)
        http.server.SimpleHTTPRequestHandler.do_GET(self)
 
    def do_POST(self):
        logging.error(self.headers)
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD': 'POST',
                     'CONTENT_TYPE': self.headers['Content-Type'],
                     })
        for item in form.list:
            logging.error(item)
        http.server.SimpleHTTPRequestHandler.do_GET(self)
 
        with open("data.txt", "w") as file:
            for key in form.keys():
                file.write(str(form.getvalue(str(key))) + ",")




def start_localhost():
    Handler = ServerHandler
 
    httpd = socketserver.TCPServer(("", 2029), Handler)
 
    print("serving at port", 2029)
    httpd.serve_forever()

已配置的禁用缓存规则

若问题由缓存导致则不符合预期,我已经在HTML文件的head标签中添加了如下禁用缓存的meta配置:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

运行场景与前端轮询代码

补充场景说明:该HTML页面运行在Edge WebView窗口中,前端发起Ajax轮询的JavaScript代码如下:

var cur_width;
var cur_height;
var cur_pos;
var cur_right;
var cur_bottom;
var cur_brightness;
var cur_blur;
var cur_zoom;
var cur_contrast;
var cur_invert;
var cur_sepia;
var cur_saturate;
var cur_grayscale;

function checker() {
  vid = document.getElementById("bg_div");
  $.ajax({
    type: "GET",
    url: 'http://localhost:2029/backgrounds/asus/video_settings.json',
    contentType: "application/json",
    dataType: "json",
    success: function(json_infos) {
      var width = json_infos.width;
      var height = json_infos.height;
      var pos = json_infos.position;
      var right = json_infos.right;
      var bottom = json_infos.bottom;
      var blur = json_infos.blur;
      var brightness = json_infos.brightness;
      var zoom = json_infos.zoom;
      var contrast = json_infos.contrast;
      var invert = json_infos.invert;
      var sepia = json_infos.sepia;
      var saturate = json_infos.saturate;
      var grayscale = json_infos.grayscale;

      var new_filter = "brightness("+brightness+") blur("+blur+") contrast("+contrast+") invert("+invert+") sepia("+sepia+") saturate("+saturate+") grayscale("+grayscale+")";

      if(width != cur_width) {
        cur_width = width;
        vid.style.width = width;
      }

      if(cur_pos != pos) {
        cur_pos = pos;
        vid.style.position = pos;
      }

      if(cur_height != height) {
        cur_height = height;
        vid.style.height = height;
      }

      if(cur_right != right) {
        cur_right = right;
        vid.style.right = right;
      }

      if(cur_bottom != bottom) {
        cur_bottom = bottom;
        vid.style.bottom = bottom;
      }

      if(cur_brightness != brightness) {
        cur_brightness = brightness;
        vid.style.filter = new_filter;
      }

      if(cur_blur != blur) {
        cur_blur = blur;
        vid.style.filter = new_filter;
      }

      if(cur_zoom != zoom) {
        cur_zoom = zoom;
        vid.style.transform = zoom;
      }

      if(cur_contrast != contrast) {
        cur_contrast = contrast;
        vid.style.filter = new_filter;
      }

      if(cur_invert != invert) {
        cur_invert = invert;
        vid.style.filter = new_filter;
      }

      if(cur_sepia != sepia) {
        cur_sepia = sepia;
        vid.style.filter = new_filter;
      }

      if(cur_saturate != saturate) {
        cur_saturate = saturate;
        vid.style.filter = new_filter;
      }

      if(cur_grayscale != grayscale) {
        cur_grayscale = grayscale;
        vid.style.filter = new_filter;
      }
    }
  });
}

checker();
var t = setInterval(checker, 400);
最终排查结论

最终定位问题根源为Python内置http模块处理性能过慢,替换为打包为EXE的PHP程序提供HTTP服务后问题解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:24:29