2

我目前正在研究 Python 的习语和库,以帮助我进行控制任务的状态机设计。

我在另一个 SO 问题中找到了很好的建议:Python state-machine design。在答案中,建议使用PySCXML来解释状态图 XML文件。

我关心 PySCXML 自述文件中的以下句子:

您可以使用 StateMachine 实例的 send 方法将事件发送到您的状态机 [...] 当然,您必须从不同的线程发送

这是否意味着我不能让状态机处理同步运行?

当我想象在我的控制任务中使用 PySCXML 时:

  1. 读入输入
  2. 将输入转换为状态机域中的抽象输入变量
  3. 将变量发送到 PySCXML 状态机实例
  4. PySCXML 状态机实例计算新状态,并设置抽象输出变量
  5. 将抽象输出变量转换为输出
  6. 写出输出
  7. 睡到下一个

(如果 PySCXML 完全可以做到这一点。这将允许我将整个排序逻辑完全分离到一个 SCXML 文件中。)我需要按顺序处理所有步骤,尤其是 4. 不允许异步运行。

4

1 回答 1

3

你想要做的事情是很有可能的。尽管这确实行不通

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')将阻塞直到状态机进入稳定状态(即直到它等待进一步的外部事件)。

于 2013-02-22T11:32:44.030 回答