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

Python中的状态机:在转换或状态下运行代码?,python,state,transitions,Python,State,Transitions,我对python语言相当陌生,请在这一点上容忍我 我想在两个独立的线程中运行两个状态机,通过队列相互通信。我使用这个包来创建状态机 我的理解是,执行操作的所有操作/代码都必须隐藏在事务中 这些行取自transitions包的示例,显示了在何处放置转换代码 # escapades. Because the legal department says so. self.machine.add_transition('complete_mission', 'saving the world', 'sw

我对python语言相当陌生,请在这一点上容忍我

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

我的理解是,执行操作的所有操作/代码都必须隐藏在事务中

这些行取自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
    


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

我明白了,我是这样构建代码的,但在试图让队列双向工作并发送内容时,偶然发现了这个问题。谢谢你的帮助!