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

我对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

(你当然应该尽量避免全局变量和工作OO,但我正在简化,因为它不是这个答案的重点).
>接下来你应该有一个队列和状态机操纵器函数,由每个线程运行:

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

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

转载注明原文:Python中的状态机:在转换或状态下运行代码? - 代码日志