From 1d4fc7a6916e3f54acda10ad6fd9caffbc711709 Mon Sep 17 00:00:00 2001 From: 3970260761 <3970260761@qq.com> Date: Sat, 7 Nov 2026 23:24:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=80=E9=94=AE=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=97=81=E5=8A=A0=E5=81=9C=E6=AD=A2=E6=8C=89=E9=92=AE=E5=8F=AF?= =?UTF-8?q?=E4=B8=AD=E6=96=AD+=E5=8F=96=E6=B6=88=E6=A0=87=E8=AE=B0=20v1.3.?= =?UTF-8?q?6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 29 +++++++++++++++++++++++++---- public/index.html | 9 +++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/app.py b/app.py index 6674759..6a2c88a 100644 --- a/app.py +++ b/app.py @@ -600,8 +600,8 @@ def api_cpu_advise(): "level": level, "verdict": verdict, "tips": tips, "top_cpu": [{"name": t.get("name"), "cpu": t.get("cpu"), "pid": t.get("pid")} for t in tops]}) -_OPT_JOB = {"running": False, "done": False, "steps": [], "freed": 0, - "available": 0, "started": 0} +_OPT_JOB = {"running": False, "done": False, "cancelled": False, "cancel": False, + "steps": [], "freed": 0, "available": 0, "started": 0} def _optimize_worker(): job = _OPT_JOB @@ -615,6 +615,17 @@ def _optimize_worker(): steps.append("数据落盘(sync)完成") except Exception as e: steps.append("数据落盘跳过: %s" % e) + if job.get("cancel"): + job["steps"] = steps + ["已手动停止,后续步骤取消"] + job["cancelled"] = True + job["done"] = False + job["running"] = False + job["cancel"] = False + try: + job["available"] = psutil.virtual_memory().available + except Exception: + pass + return try: p = os.environ.get("PROCFS_PATH", "/proc") with open(os.path.join(p, "sys", "vm", "drop_caches"), "w") as f: @@ -630,6 +641,7 @@ def _optimize_worker(): job["freed"] = max(0, after_mem - before_mem) job["available"] = after_mem job["done"] = True + job["cancelled"] = False job["running"] = False @app.route("/api/sys/optimize", methods=["POST"]) @@ -639,11 +651,19 @@ def api_sys_optimize(): if _OPT_JOB.get("running"): return jsonify({"ok": False, "running": True, "msg": "优化正在进行中,请稍候"}), 409 - _OPT_JOB.update({"running": True, "done": False, "steps": [], - "freed": 0, "available": 0, "started": time.time()}) + _OPT_JOB.update({"running": True, "done": False, "cancelled": False, "cancel": False, + "steps": [], "freed": 0, "available": 0, "started": time.time()}) threading.Thread(target=_optimize_worker, daemon=True).start() return jsonify({"ok": True, "started": True, "eta": 20}) +@app.route("/api/sys/optimize/cancel", methods=["POST"]) +def api_sys_optimize_cancel(): + """停止优化: 置取消标记,worker 在步骤间隙退出,不阻塞""" + if not _OPT_JOB.get("running"): + return jsonify({"ok": False, "msg": "当前没有正在进行的优化"}) + _OPT_JOB["cancel"] = True + return jsonify({"ok": True, "msg": "已发送停止信号"}) + @app.route("/api/sys/optimize/status") def api_sys_optimize_status(): job = _OPT_JOB @@ -653,6 +673,7 @@ def api_sys_optimize_status(): elapsed = 0 return jsonify({"running": job.get("running", False), "done": job.get("done", False), + "cancelled": job.get("cancelled", False), "steps": job.get("steps", []), "freed": job.get("freed", 0), "available": job.get("available", 0), diff --git a/public/index.html b/public/index.html index e6bc648..0bb65c5 100644 --- a/public/index.html +++ b/public/index.html @@ -56,7 +56,7 @@ button.refresh{background:#20a53a;color:#fff;border:none;border-radius:3px;paddi