Python transitions库如何从状态回调中安全触发转换?
你遇到的两个问题核心是在状态回调中同步触发新转换导致的嵌套调用,transitions库原生提供了两种更优的实现方式:
方案1:启用队列转换,保留现有写法
初始化状态机时添加queued=True参数即可解决两个缺陷:
- 所有在回调中触发的转换会进入队列等待,当前转换流程完全结束后才会按顺序执行队列中的转换,不会产生嵌套调用栈,从根本上避免栈溢出
- 无需在触发转换后手动添加return语句,队列机制会自动处理后续流转
修改后的核心代码如下:
import random from transitions.extensions import HierarchicalGraphMachine states = ["Begin", "CheckCondition", "MakeA", "MakeB", "End"] transitions = [ ["proceed", "Begin", "CheckCondition"], ["path_a", "CheckCondition", "MakeA"], ["path_b", "CheckCondition", "MakeB"], ["proceed", "MakeA", "End"], ["proceed", "MakeB", "End"] ] class MyModel: def __str__(self): return f">>>>>> STATE: {self.state}" def on_enter_CheckCondition(self): if random.randint(1, 10) > 5: self.path_a() else: self.path_b() # 不需要手动加return my_model = MyModel() machine = HierarchicalGraphMachine( model=my_model, states=states, transitions=transitions, initial="Begin", ignore_invalid_triggers=False, queued=True # 仅需添加这一行 ) while my_model.state != "End": my_model.proceed()
方案2:使用条件转换,符合FSM设计范式
这是更推荐的实现方式,无需在状态回调中手动触发转换,把分支逻辑直接定义在转换规则中,所有流转逻辑统一维护,可读性更强:
import random from transitions.extensions import HierarchicalGraphMachine states = ["Begin", "CheckCondition", "MakeA", "MakeB", "End"] # 转换规则直接添加条件判断 transitions = [ ["proceed", "Begin", "CheckCondition"], # 满足条件时走对应分支 ["proceed", "CheckCondition", "MakeA", {"conditions": "is_path_a"}], ["proceed", "CheckCondition", "MakeB", {"conditions": "is_path_b"}], ["proceed", "MakeA", "End"], ["proceed", "MakeB", "End"] ] class MyModel: def __str__(self): return f">>>>>> STATE: {self.state}" # 条件判断方法,返回布尔值 def is_path_a(self): return random.randint(1, 10) > 5 def is_path_b(self): return not self.is_path_a() my_model = MyModel() machine = HierarchicalGraphMachine( model=my_model, states=states, transitions=transitions, initial="Begin", ignore_invalid_triggers=False ) while my_model.state != "End": my_model.proceed()
内容的提问来源于stack exchange,提问作者Alessandro Della Villa
相关产品推荐
相关产品推荐

