Files
Genarrative/apps
lhk229 802f06d59d 全局异步 runtime 的 worker 用上 Runtime 自己的栈预算
Agent Runner 在父 run 认领委派回执那一刻整进程消失,调用方只看到 connect 超时,
runner 日志里两行 stderr 又被日志泵按「非诊断输出」抹掉。放开原始 stderr 后拿到
真相:thread 'tokio-rt-worker' has overflowed its stack。

Runtime 的 agent turn 调用链本来就深,task_queue 早就给自己起的后台线程配了
AGENT_RUNTIME_BACKGROUND_WORKER_STACK_BYTES;但静态委派的父 run 唤醒走的是
tauri::async_runtime::spawn,落在 Tauri 全局 runtime 的 worker 上——那个 runtime
由 TokioRuntime::new() 建出,worker 吃 tokio 默认栈(tokio 1.52 起该线程名就叫
tokio-rt-worker)。同一段代码在自家 16 MiB 线程上天天跑完整轮次,换到默认栈就爆,
所以不是无限递归,是那条链从来没被这个线程池的尺寸覆盖过。

进程入口在任何异步派发之前用同一个常量建 runtime 并 async_runtime::set 装上;
handle 要求底层 Runtime 常驻,故刻意泄漏。这样十余处 async_runtime::spawn 一次
性都拿到同一份栈预算,而不是逐个改调用点。

回归用例在自建 runtime 上 spawn 一条 3 MiB 深的调用链。注意它的失败形态是整个
测试进程被 abort 而不是断言失败——已实测拿掉 thread_stack_size 后复现的正是线上
那行 tokio-rt-worker has overflowed its stack。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 11:41:20 +00:00
..
2026-07-17 16:56:46 +08:00