症状
程序 panic: Cannot start a runtime from within a runtime。它发生在从异步任务内部调用 block_on,或同步库在已有环境运行时的情况下内部创建并驱动运行时。Tokio 禁止嵌套,因为内层运行时会阻塞执行器线程并破坏其他任务的推进。
诊断
搜索异步代码中的 block_on;改为直接 await 异步函数;用 spawn_blocking 承载同步工作。
grep -rn "block_on\|Runtime::new" src
根因
代码在已在 Tokio 运行时内执行时又尝试创建或驱动运行时,Tokio 禁止这种做法,因为嵌套运行时会破坏调度保证。
修复
在异步上下文中用 await 调用异步函数;同步工作用 spawn_blocking;仅在尚未处于运行时的入口点使用 block_on。
验证
重跑该路径确认不再 panic,并确认异步工作仍完成并返回预期结果。无 panic 且完成即证明执行模型正确。
常见陷阱
在异步任务里直接调用阻塞式 io 会拖住执行器;应使用异步 API 或 spawn_blocking。