我使用python转换模块(link)来创建有限状态机。
如何永远运行这个有限状态机?
基本上我想要的是一个fsm模型,当没有更多事件可以触发时,它可以保持“空闲”状态。
例如,在example.py中:
state = [ 'A', B', 'C']
transtion = [ A->B->C]
if name == 'main':
machine = Machine(state, transition, initial='A')**
print(machine.state)**
如果我在python程序中运行这台机器,它将进入状态'A',打印当前状态,程序将立即退出。
所以我的问题是,当没有任何东西可以触发转换时,如何让它永远保持运行?我应该实现一个循环还是有其他方法可以这样做?
答案 0 :(得分:0)
由于问题有点宽泛,我必须假设一两件事。 例如,没有说明您计划如何为机器提供要处理的事件。
我应该实现一个循环还是有其他方法可以这样做?
嗯,这取决于您计划使用的事件机制类型。有些实现会为do做,有些则不会。
例如,您可以将计算机耦合到事件队列,您必须自己处理事件循环。在下面的示例中,我将随机数提供给模型,该模型将使用机器根据传递的数字更改状态。
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
时关闭。
答案 1 :(得分:0)
您可以使用while循环。只需创建一个新变量,将其设置为0.要使用forever循环,只需像这样执行while循环
forever_variable = 0
while forever_variable == 0:
(code to be run forever)