Python 中的状态机:运行 转换或状态中的代码?

State Machine in Python: Run Code in Transition or State?

我对 python 语言比较陌生,请多多包涵。

我想 运行 两个独立线程中的两个状态机,通过队列相互通信。我使用 transitions 包来创建状态机。

我的理解是,所有执行操作的 actions/code 都必须包含在交易中。

这些行取自 transitions 包的示例,显示了放置转换代码的位置

# escapades. Because the legal department says so.
self.machine.add_transition('complete_mission', 'saving the world', 'sweaty', 
                         after='update_journal')
def update_journal(self):
        """ Dear Diary, today I saved Mr. Whiskers. Again. """
        self.kittens_rescued += 1

但是,一旦我达到某个状态,我将如何观察我的队列,以便对发送到那里的消息做出反应,这些消息会导致从一种状态转换到另一种状态?根据我的基本知识,我希望我的状态中的代码等待可以触发转换的消息并调用转换到以下状态。

我必须在状态机内创建一个线程,将状态机对象作为参数传递,以便能够触发转换。

我对这个包的理解是否正确?还是我用错了?

我建议采用完全不同的方式。最起码按照这个建议调试和维护应该会容易很多,我觉得(下面解释)。

  • 首先,您的状态机代码应该更新队列或直接监听队列。相反,它应该只更新一些变量,如下所示:

    next_action = ''
    
    This is a transition
    def update_action(self, action):
        global next_action
        next_action = action
    

    (你当然应该尽量避免使用全局变量和面向对象工作,但我正在简化,因为这不是这个答案的重点)。

  • 接下来你应该有一个队列和状态机操纵函数,运行每个线程:

    while some_condition:
         get the action from the queue
         update the state machine
         obtain the action from next_action
         push to the queue
    

说明 - 您应该始终将逻辑代码与系统代码分开。编写一个不与队列、线程等交互的状态机,可以让您编写更容易在单元测试中调试和测试的代码。只有当逻辑起作用时,您才应该将它连接到队列等。