【问题标题】:How to run a fsm model forever如何永远运行 fsm 模型
【发布时间】:2017-07-26 08:29:14
【问题描述】:

我正在使用 python 转换模块 (link) 来创建有限状态机。

如何永远运行这个有限状态机?

基本上我想要的是一个 fsm 模型,它可以在没有更多事件触发时保持“空闲”。

例如l,在example.py中:

state = [ 'A', B', 'C']
transtion = [ A->B->C]

if name == 'main':
machine = Machine(state, transition, initial='A')**
print(machine.state)**

如果我在python程序中运行这台机器,它将进入状态'A',打印当前状态,然后程序将立即退出。

所以我的问题是,当没有任何东西可以触发转换时,如何让它永远运行?我应该实现一个循环还是有其他方法可以做到这一点?

【问题讨论】:

  • 大家好,我忘记在问题中提到我正在使用 python 转换模块。 github.com/pytransitions/transitions
  • 您提供的不是工作 python 代码...除了您可能想查看与 threading 配对的 while 循环

标签: python transitions automata state-machine


【解决方案1】:

由于这个问题有点宽泛,我不得不假设一两件事。 例如,没有说明您计划如何为机器提供要处理的事件。

我应该实现一个循环还是有其他方法可以做到这一点?

嗯,这取决于您打算使用哪种事件机制。有些实现会这样做,有些则不会。

例如,您可以将一台机器连接到一个事件队列,您必须自己处理事件循环。在下面的示例中,我将随机数提供给模型,该模型将使用机器根据传递的数字更改状态。

from transitions import Machine
from threading import Thread
import random
import time

try:
    from Queue import Queue
except ImportError:  # Module has been renamed in Python 3
    from queue import Queue


class Model(Thread):

    def __init__(self, event_queue):
        self.event_queue = event_queue
        # has to be called whenever something inherits from Thread
        super(Model, self).__init__()

    def run(self):
        while True:
            event = self.event_queue.get(block=True)
            # 0 will end the event loop
            if event == 0:
                return
            # if the passed number is even, switch to Even state
            elif event % 2 == 0:
                self.even()
            # switch to Odd state otherwise
            else:
                self.odd()

states = ['Even', 'Odd']
transitions = [['even', '*', 'Even'],
               ['odd', '*', 'Odd']]

event_queue = Queue()
model = Model(event_queue)
machine = Machine(model, states=states, transitions=transitions, initial='Even')
model.start()

for n in random.sample(range(1, 20), 5):
    event_queue.put(n)
    time.sleep(0.1)
    print("Number {0} was passed to the model which is now in state {1}".format(n, model.state))

# shut down model thread
event_queue.put(0)

模型实际上会阻塞,直到它收到下一个事件,并在收到事件0时关闭。

【讨论】:

    【解决方案2】:

    您可以使用 while 循环。只需创建一个新变量,将其设置为 0。要使用永远循环,只需像这样执行一个 while 循环

    forever_variable = 0
    while forever_variable == 0:
        (code to be run forever)
    

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 2018-08-12
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2020-09-21
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多