Skip to content

执行生命周期、暂停恢复与保存恢复

可视化边界:状态机图强调运行语义;导出配置时仍需具名 handler / condition。

1. Execution 状态机

如何阅读这张图

  • cancelled 当前是显式状态常量,但没有对外 cancel() API,这表示状态语义已经存在,公开控制接口还没有开放。
  • waiting 是“等待外部继续”,不是线程阻塞。

2. start()start_execution()

  • flow.start(...) 适合直接等待结果的场景
  • flow.start_execution(..., wait_for_result=False) 适合长生命周期 execution

3. 暂停、保存、恢复链路

架构思路

  • save() / load() 恢复的是流程语义状态,不是 Python 协程栈。
  • 所以真正可靠的恢复方式永远是“等待外部事件再继续”,而不是期待某个正在执行的协程原地复活。

4. 中断与恢复

python
interrupt = await data.async_pause_for(
    type="human_input",
    payload={"question": "approve?"},
    resume_event="UserFeedback",
)

后续可通过:

  • get_interrupt(interrupt_id)
  • get_pending_interrupts()
  • continue_with(interrupt_id, value)

恢复执行。

5. save() 会保存什么

save() 当前会保存:

  • execution_id
  • status
  • runtime_data
  • flow_data
  • interrupts
  • last_signal
  • resource_keys
  • result

不会保存:

  • 运行依赖对象本身
  • Python 协程栈

6. get_last_signal()

last_signal 会记录最近一次被 dispatch 的信号,可用于:

  • 调试
  • 审计
  • save/load 后判断恢复点

7. 当前最佳实践

  • 长任务优先 start_execution(..., wait_for_result=False)
  • 等外部输入时优先 pause_for(),不要 busy loop
  • state 存恢复状态,让 resources 存运行依赖