fix: 调试执行移入子进程并加上资源限制

pg_logger 原来直接在 API 进程内跑用户代码,有三个问题:

- /debug 是 async def 却做同步的 CPU 密集跟踪,单个请求会堵死事件循环
- exec_script_str_local 传了 disable_security_checks=True,setrlimit 被跳过,
  MAX_EXECUTED_LINES 只能限制行事件数,挡不住 sum(range(10**9)) 这类单行重计算
- input_string_queue 和 sys.stdout 都是模块级全局,并发请求会互相干扰

改成在子进程里执行:子进程内设 CPU 5s / 内存 512MB(软硬限留差值,
让 SIGXCPU 先于 SIGKILL 到达以便区分原因),父进程再加 15s 墙钟超时兜住
time.sleep 这类不耗 CPU 的挂起。端点改同步 def 走线程池,异常统一转成
400 + 中文 detail。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019QGZaLUWzGPEMTk6A5RShC
This commit is contained in:
2026-09-07 04:45:49 -06:00
parent a4f4c9f7b9
commit ebf541c1fe
2 changed files with 139 additions and 11 deletions

21
main.py
View File

@@ -13,7 +13,7 @@ from schemas import (
FormatResponse,
)
from database import DatabaseService
from pg_logger import exec_script_str_local
from debug_runner import DebugError, run_debug
from formatter import format_code, FormatError
from dotenv import load_dotenv
@@ -132,17 +132,16 @@ async def ai_analysis(request: AIAnalysisRequest):
@app.post("/debug")
async def debug(request: DebugRequest):
"""调试端点"""
code = request.code
inputs = request.inputs
def debug(request: DebugRequest) -> dict:
"""调试端点
data = {}
def dump(input_code, output_trace):
data.update(dict(code=input_code, trace=output_trace))
exec_script_str_local(code, inputs, False, False, dump)
用同步 def 而不是 async def跟踪执行是 CPU 密集的阻塞调用,
交给 FastAPI 的线程池,避免堵死事件循环。
"""
try:
data = run_debug(request.code, request.inputs)
except DebugError as e:
raise HTTPException(status_code=400, detail=str(e))
return {"data": data}