Senzoukria 脚本编程里的“脚本在 2000 毫秒后被中断(死循环?)”

Senzoukria 的每一个脚本都跑在一个沙箱化的 worker 里,每次运行有 2 秒的预算。超出这个预算的脚本会被停掉,并写出“脚本在 2000 毫秒后被中断(死循环?)”;而一个从来没有启动起来的沙箱报的是另一条消息。

Senzoukria · 故障排除 · 更新于 2026 年 9 月


概要

超时
“脚本在 {ms} 毫秒后被中断(死循环?)”
预算
每次运行 2 000 毫秒
沙箱没有被提供出来
“沙箱不可用:{scheme} 协议在 {ms} 毫秒内没有返回任何内容(应用是否在 Tauri 之外启动?)”
影响
图表继续运行;这一次脚本运行返回一个错误

你会看到什么

脚本控制台和流水线那一条会把这次运行显示为失败,写着“脚本在 2000 毫秒后被中断(死循环?)”。如果沙箱压根就没有应答过,错误则是“沙箱不可用:{scheme} 协议在 {ms} 毫秒内没有返回任何内容(应用是否在 Tauri 之外启动?)”。

为什么会这样

脚本跑在一个沙箱化的 worker 里,没有网络、没有文件访问、也没有经纪商 API。一次在预算之内没有作出应答的运行会被停掉,这样一个坏掉的脚本就没办法把图表冻住。最常见的原因是一个永远不会结束的循环,或者是一个遍历所有 K 线的循环又套在另一个遍历所有 K 线的循环里面。这两种失败被刻意分开:曾经有两个半月的时间,一个没有启动起来的沙箱一直被读成一个很慢的脚本。启动 Python 引擎的耗时是单独计时的,不算在这 2 秒的预算里。

所以这条消息回答的是一个很具体的问题:这次运行没有在预算之内交回结果。它并不断言你的逻辑是错的,只是说在被停掉的那一刻它还没有算完。

如何解决

  • 去找那些退出条件可能一直为假的 while 循环,以及那种永远不会被更新的计数器。
  • 把遍历所有 K 线的嵌套循环,换成一次带着累计量往前走的单遍遍历。
  • 在一个更短的图表范围上测一下,看看耗时是否随 K 线数量一起增长。
  • 用脚本助手:它可以运行这个脚本、读到真实的错误,并提出一个修法。
  • 碰到沙箱那条消息时请重启应用;它说明的是沙箱协议什么都没有提供出来。

它并不意味着什么

  • 不是应用崩了:一个坏掉的脚本从来不会把图表弄死。
  • 也不是语法错误:那一类会指向具体的行(“第 {line} 行失败”)。

何时联系技术支持

经过这些检查之后还是卡住?请用 菜单 → 问题反馈,或者发到 Senzoukria 的 Discord 上。请附上一个能最小化复现这次中断的脚本,并说明它跑在哪张图表、哪个周期上。

同一栏目

其他语言版本

常见问题

这 2 秒的预算是按每根 K 线算,还是按每次运行算?
按每次运行算。C++ 工具链列出的是同一个上限:每次运行 2 秒,每次调用带最近 256 根 K 线。
Python 脚本也是同样的预算吗?
它们的执行遵循同一套沙箱规则;只有 Python 引擎的启动耗时是在这 2 秒预算之外单独计时的。
脚本被停掉之后,图表上已经画出来的东西会消失吗?
不会。被停掉的只有这一次脚本运行,它返回一个错误;图表本身继续运行。

继续阅读