我对蟒蛇语言比较陌生,请耐心等待。
我想在两个独立的线程中运行两个状态机,通过队列相互通信。我使用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
但是,一旦我到达某个状态,我将如何看待我的队列,以便对发送到那里的消息作出反应,从而导致从一个状态转换到另一个状态?根据我的基本知识,我希望我的状态中的代码等待可能触发转换的消息,并调用转换到以下状态。
我必须在状态机内创建一个线程,将状态机对象作为参数传递,以便能够触发转换。
我是否正确理解了此包装?或者我错误地使用它?
答案 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
说明 - 您应该始终将逻辑代码与系统代码分开。编写不与队列,线程等交互的状态机,允许您编写在单元测试中更容易调试和测试的代码。只有逻辑有效,才能将它连接到队列等。