2015-05-27 66 views
4

我對Python語言頗爲陌生,請耐心等待。Python中的狀態機:在轉換或狀態中運行代碼?

我想在兩個單獨的線程中運行兩個狀態機,通過隊列相互通信。我使用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 

不過,我會怎麼看我的隊列,一旦我達到的狀態,以對發送給那些應該導致從一個狀態轉換到另一個狀態的消息做出反應?根據我的基本知識,我希望處於狀態的代碼能夠等待可能觸發轉換的消息並調用轉換到以下狀態。

我將不得不在狀態機內創建一個線程,將狀態機對象作爲參數傳遞以便能夠觸發轉換。

我是否正確理解此軟件包?或者我錯用了它?

回答

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 
    

解釋 - 你應該始終從系統中分離出來的邏輯代碼碼。編寫一個不與隊列,線程等交互的狀態機,可以讓你編寫在單元測試中更易於調試和測試的代碼。只有邏輯運行一次,你是否應該將它連接到隊列等。

+0

我看到了,我構建了這樣的代碼,但後來偶然發現了這個問題,試圖讓隊列雙向工作併發送內容。謝謝您的幫助! – JoeyD