fix: 合规审查卡死修复 + 小红书复制格式 + today-only过滤
This commit is contained in:
@@ -4,6 +4,7 @@ import logging
|
||||
import os
|
||||
import json
|
||||
import time
|
||||
import threading
|
||||
from datetime import datetime
|
||||
from typing import List, Optional, Dict
|
||||
|
||||
@@ -14,6 +15,7 @@ if os.getenv('PROJECT_ROOT'):
|
||||
PROJECT_ROOT = Path(os.getenv('PROJECT_ROOT'))
|
||||
|
||||
_running_processes: Dict[str, dict] = {}
|
||||
_lock = threading.Lock()
|
||||
|
||||
def _get_cmd(topic_ids: List[str] = None):
|
||||
script_path = PROJECT_ROOT / "scripts" / "compliance_optimizer.py"
|
||||
@@ -23,15 +25,22 @@ def _get_cmd(topic_ids: List[str] = None):
|
||||
cmd = [str(venv_python), str(script_path)] if venv_python.exists() else ["python3", str(script_path)]
|
||||
if topic_ids:
|
||||
cmd.extend(["--topic-ids", ','.join(topic_ids)])
|
||||
else:
|
||||
cmd.append("--today-only")
|
||||
return cmd
|
||||
|
||||
def run_optimizer(topic_ids: List[str] = None):
|
||||
"""非阻塞:后台启动合规审查脚本,立即返回"""
|
||||
cmd = _get_cmd(topic_ids)
|
||||
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, cwd=str(PROJECT_ROOT))
|
||||
_running_processes["optimizer"] = {"pid": proc.pid, "started_at": time.time(), "process": proc, "topic_ids": topic_ids}
|
||||
with _lock:
|
||||
existing = _running_processes.get("optimizer", {})
|
||||
proc = existing.get("process")
|
||||
if proc and proc.poll() is None:
|
||||
raise RuntimeError("已有合规审查任务正在运行,请等待完成后再试")
|
||||
cmd = _get_cmd(topic_ids)
|
||||
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, cwd=str(PROJECT_ROOT))
|
||||
_running_processes["optimizer"] = {"pid": proc.pid, "started_at": time.time(), "process": proc, "topic_ids": topic_ids}
|
||||
logger.info("Optimizer started in background (pid=%s, topic_ids=%s)", proc.pid, topic_ids)
|
||||
return {"ok": True, "pid": proc.pid, "topic_ids": topic_ids}
|
||||
return {"ok": True, "pid": proc.pid, "topic_ids": topic_ids, "_proc": proc}
|
||||
|
||||
def run_optimizer_blocking(topic_ids: List[str] = None, timeout: int = 600):
|
||||
"""阻塞版:带超时,给定时任务使用"""
|
||||
@@ -54,9 +63,11 @@ def get_optimizer_status() -> Optional[Dict]:
|
||||
if not info:
|
||||
return None
|
||||
proc = info["process"]
|
||||
if "finished" in info:
|
||||
return {"status": "completed" if info.get("returncode") == 0 else "failed", "pid": info["pid"], "elapsed": round(time.time() - info["started_at"], 1), "returncode": info.get("returncode")}
|
||||
if proc.poll() is not None:
|
||||
stdout, stderr = proc.communicate()
|
||||
info["returncode"] = proc.returncode
|
||||
info["finished"] = True
|
||||
elapsed = time.time() - info["started_at"]
|
||||
del _running_processes["optimizer"]
|
||||
return {"status": "completed" if proc.returncode == 0 else "failed", "pid": info["pid"], "elapsed": round(elapsed, 1), "returncode": proc.returncode, "stdout": stdout.strip()[-300:], "stderr": stderr.strip()[-300:]}
|
||||
return {"status": "completed" if proc.returncode == 0 else "failed", "pid": info["pid"], "elapsed": round(elapsed, 1), "returncode": proc.returncode}
|
||||
return {"status": "running", "pid": info["pid"], "elapsed": round(time.time() - info["started_at"], 1)}
|
||||
|
||||
Reference in New Issue
Block a user