同步 PySCXML

3 投票
1 回答
767 浏览
提问于 2025-04-17 16:37

我现在正在研究一些Python的用法和库,想用它们来设计一个控制任务的状态机。

我在另一个StackOverflow的问题中找到了不错的建议:Python状态机设计。在这些回答中,有人推荐了PySCXML,这个库可以用来解析状态图XML文件。

我对PySCXML的说明文档中的以下句子有些担心:

你可以使用状态机实例的send方法向你的状态机发送事件[...] 当然,你必须在不同的线程中进行发送

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

我想象着用PySCXML来处理我的控制任务的步骤:

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

(如果这在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') 这个命令会一直等待,直到状态机进入一个稳定的状态(也就是说,它在等待进一步的外部事件)。

撰写回答