同步 PySCXML
我现在正在研究一些Python的用法和库,想用它们来设计一个控制任务的状态机。
我在另一个StackOverflow的问题中找到了不错的建议:Python状态机设计。在这些回答中,有人推荐了PySCXML,这个库可以用来解析状态图XML文件。
我对PySCXML的说明文档中的以下句子有些担心:
你可以使用状态机实例的send方法向你的状态机发送事件[...] 当然,你必须在不同的线程中进行发送
这是否意味着我不能让状态机的处理同步进行?
我想象着用PySCXML来处理我的控制任务的步骤:
- 读取输入
- 将输入转换为状态机领域中的抽象输入变量
- 将变量发送给PySCXML状态机实例
- PySCXML状态机实例计算新的状态,并设置抽象输出变量
- 将抽象输出变量转换为输出
- 写出输出
- 等待直到下一个
(如果这在PySCXML中是可能的。这将让我可以将整个顺序逻辑完全分离到一个SCXML文件中。)我需要所有步骤按顺序处理,特别是第4步不能异步执行。
1 个回答
4
你想做的事情是完全可以实现的。虽然确实有些方法是行不通的:
xml = '''\
<scxml version="1.0" datamodel="python">
<state id="s1">
<transition event="e" target="f" />
</state>
<final id="f" />
</scxml>
'''
sm = Statemachine(xml)
sm.start()
# never runs
sm.send("e")
不过,你可以这样做:
xml = '''\
<scxml version="1.0" datamodel="python">
<state id="s1">
<transition event="e" target="f" />
</state>
<final id="f" />
</scxml>
'''
sm = Statemachine(xml)
sm.start_threaded()
sm.send("e")
这样做会在一个独立的绿色线程中运行状态机的主事件循环,这样你就可以在主线程中与它进行交互。sm.send('e')
这个命令会一直等待,直到状态机进入一个稳定的状态(也就是说,它在等待进一步的外部事件)。