Skip to content

循环与重入安全

可视化边界:图里会示意循环关系;若导出 JSON/YAML,请继续使用具名 handler / condition。

TriggerFlow 可以做循环,但推荐做“可证明会停下来的循环”。

1. 三种安全循环模式

如何阅读这张图

  • 真正安全的不是“能循环”,而是“每种循环的停机条件和控制权都清楚”。
  • 三种模式分别对应纯内部控制、外部批准控制、外部事件驱动控制。

2. 有界自循环

最简单的安全方式是给每轮明确终止条件:

python
async def loop_step(data):
    count = int(data.state.get("count", 0) or 0)
    if count >= 3:
        data.set_result({"done": True, "count": count})
        return
    data.state.set("count", count + 1, emit=False)
    await data.async_emit("Loop", count + 1)

3. pause/resume 回合式循环

更稳的方式是每轮暂停,等外部决定是否继续:

  • step -> pause_for()
  • 外部 continue_with()
  • ResumeLoop -> emit("Loop")

这种方式适合:

  • 人机协作
  • 审批流
  • 长事务

4. 外部事件重入

很多时候最安全的“循环”不是自发信号,而是 execution 等外部持续重入:

python
execution.emit("Tick", 1)
execution.emit("Tick", 1)
execution.emit("Tick", 1)

这适合:

  • webhook
  • MQ
  • 定时触发

5. 关键原则

  • 每一轮都要有明确退出条件
  • 若循环承担最终输出,记得 set_result().end()
  • 不要把无限自旋当默认控制流