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

时间:2015-05-27 20:27:04

标签: python state transitions

我对蟒蛇语言比较陌生,请耐心等待。

我想在两个独立的线程中运行两个状态机,通过队列相互通信。我使用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

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

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

我是否正确理解了此包装?或者我错误地使用它?

1 个答案:

答案 0 :(得分:3)

我建议做得与众不同。至少,在我看来,根据这个建议调试和维护它应该要容易得多(我在下面的解释)。

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

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

    (你当然应该尽量避免全局变量和工作OO,但我简化了,因为它不是这个答案的重点)。

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

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

说明 - 您应该始终将逻辑代码与系统代码分开。编写不与队列,线程等交互的状态机,允许您编写在单元测试中更容易调试和测试的代码。只有逻辑有效,才能将它连接到队列等。