2017-07-26 10 views
0

私は有限状態マシンを作成するためにPythonの遷移モジュール(link)を使用しています。fsmモデルを永遠に実行するには

この有限状態マシンを永遠に実行するにはどうすればよいですか?

私が望むのは、トリガーするイベントがなくなると「アイドル」に留まることができるfsmモデルです。私はPythonプログラムでこのマシンを実行する場合は

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

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

、それは、状態「A」に入り、現在の状態を印刷し、プログラム意志して終了します:example.pyでexamplelについては

、すぐに。

私の質問は、トランジションを引き起こすものがないときに、どうすれば永久に稼動させることができるのでしょうか?ループを実装するか、そうするための他の方法がありますか?

+0

こんにちはすべてのようなwhileループを行い、永遠にループを使用するには0に設定し、私はPythonのトランジションモジュールを使用していますquesitonに言及するのを忘れています。 https://github.com/pytransitions/transitions –

+1

あなたが提供するものは、Pythonコードを動作させていません。ただし、 'while 'サイクルを' threading'とペアにすることをお勧めします – gionni

答えて

0

質問が多少広がっているので、私は1つか2つのことを想定しなければなりません。 例えば、マシンに対して処理されるイベントをどのように提供するかについては記述されていません。

私はループを実装する必要がありますか、そうする方法はありますか?

これは、使用する予定のイベントメカニズムの種類によって異なります。いくつかの実装はそうするために、他の実装はそれをしません。

たとえば、マシンをイベントキューに接続して、イベントループを自分で処理する必要があります。以下の例では、渡された数値に応じて状態を変更するためにマシンを使用するモデルに乱数を送ります。

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ループを使用できます。ただ、新しい変数を作成し、ちょうどこの

forever_variable = 0 
while forever_variable == 0: 
    (code to be run forever) 
関連する問題