diff --git a/sanguo_orchestrator/portfolio_worker.py b/sanguo_orchestrator/portfolio_worker.py index c6b46b2..0427136 100644 --- a/sanguo_orchestrator/portfolio_worker.py +++ b/sanguo_orchestrator/portfolio_worker.py @@ -21,7 +21,7 @@ logger = logging.getLogger(__name__) _VPS_HOST = "49.232.102.198" _VPS_WORKDIR = r"C:\\sanguo_vnpy_v2" _VPS_PYTHON = "python" -_TIMEOUT = 3600 # 1 hour hard cap (was 600s sync in routes_portfolio) +_TIMEOUT = 10800 # 3h hard cap (was 3600/1h; 全市场全周期 60-100min/策略不够) def run_portfolio_task(spec: dict) -> Any: @@ -56,10 +56,21 @@ def run_portfolio_task(spec: dict) -> Any: argv, cwd = _build_argv(start, end, cash, benchmark, max_pool, provider_config, strategy) logger.info("[portfolio_worker] task=%s running: %s", task_id, " ".join(argv[3:])) - proc = subprocess.run( - argv, cwd=cwd, capture_output=True, text=True, - timeout=_TIMEOUT, check=False, - ) + try: + proc = subprocess.run( + argv, cwd=cwd, capture_output=True, text=True, + timeout=_TIMEOUT, check=False, + ) + except subprocess.TimeoutExpired: + # 全市场全周期慢→3h仍超→显式log(否则_wait_future静默task.fail难排查) + logger.error( + "[portfolio_worker] task=%s TIMEOUT after %ss (argv tail=%s)", + task_id, _TIMEOUT, " ".join(argv[3:]), + ) + raise RuntimeError( + f"runner_backtest timeout after {_TIMEOUT}s " + f"(全市场全周期?考虑缩小 universe 或周期)" + ) if proc.returncode != 0: stderr_tail = (proc.stderr or "")[-2000:]