我目前正在研究 Python 的习惯用法和库,以帮助我设计控制任务的状态机。
我在另一个问题中找到了很好的建议:Python state-machine design 。 答案中,PySCXML建议允许解释 State Chart XML文件。
我对 PySCXML 自述文件中的以下句子感到担忧:
you can use the send method of the StateMachine instance to send events to your statemachine [...] Of course, you'll have to do the send from a different thread
这是否意味着我无法同步运行状态机处理?
当我想象在我的控制任务中使用 PySCXML 时:
- 读入输入
- 将输入转换为状态机域中的抽象输入变量
- 将变量发送到 PySCXML 状态机实例
- PySCXML 状态机实例计算新状态,并设置抽象输出变量
- 将抽象输出变量转换为输出
- 写出输出
- sleep 直到下一次
(如果 PySCXML 完全可以做到这一点。这将允许我将整个排序逻辑完全分离到 SCXML 文件中。)我需要按顺序处理所有步骤,尤其是 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")
在它自己的 greenlet 中运行状态机的 maineventloop,让您可以在主线程中与它交互。 sm.send('e')
将阻塞,直到状态机进入稳定状态(即直到它等待进一步的外部事件)。
关于python - 同步 PySCXML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003174/