2017-07-26 135 views
0

我正在使用python轉換模塊(link)創建有限狀態機。如何永遠運行fsm模型

如何永久運行這個有限狀態機?

基本上我想要的是一個fsm模型,當沒有更多的事件觸發時它可以保持「空閒」狀態。

對於examplel,在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

大家好while循環,我忘了,我使用python轉換模塊quesiton提。 https://github.com/pytransitions/transitions –

+1

你提供的不是Python工作的代碼......除了你可能想看'while'循環與'threading'配對 – gionni

回答

0

由於問題有點寬泛,我必須假定一兩件事情。 例如,你沒有說明你打算如何提供事件來處理機器。

我應該實現一個循環還是有其他的方式來做到這一點?

那麼,這取決於你打算使用什麼樣的事件機制。有些實現會爲做,其他人不會。

你可以將一臺機器連接到一個事件隊列,你必須自己處理事件循環。在下面的例子中,我將隨機數字提供給一個模型,該模型將根據傳遞的數字使用機器來更改狀態。

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的時刻。

0

您可以使用while循環。只要創建一個新的變量,將其設置爲0。要使用循環永遠,只是做這樣

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