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:
21
main.py
21
main.py
@@ -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}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user