2013-02-21 31 views
2

我目前正在研究Python的成語和庫,幫助我進行控制任務的狀態機設計。同步PySCXML

我在其他SO問題中找到了很好的建議:Python state-machine design。 答案中,建議PySCXML允許解釋文件State Chart XML

我很擔心從PySCXML的自述下面的句子:

可以使用的StateMachine實例的send方法將事件發送到你的statemachine [...]當然,你必須做從不同的線程發送

這是否意味着我不能讓狀態機處理同步運行?

正如我想象的使用PySCXML與我的控制任務:

  1. 閱讀中投入
  2. 翻譯狀態機領域的投入,以抽象的輸入變量
  3. 發送變量PySCXML狀態機實例
  4. PySCXML狀態機實例計算新狀態並設置抽象輸出變量
  5. 將抽象輸出變量轉換爲輸出
  6. 寫出輸出
  7. 睡眠,直到明年

(如果這是可能的PySCXML可言。這將允許我將整個定序邏輯完全分成SCXML文件。)我需要按順序處理所有步驟,特別是4.不允許異步運行。

回答

2

你想要做的事很有可能。雖然這是真的,這不會工作:

xml = '''\ 
<scxml version="1.0" datamodel="python"> 
    <state id="s1"> 
     <transition event="e" target="f" /> 
    </state> 
    <final id="f" /> 
</scxml> 
    ''' 
sm = Statemachine(xml) 
sm.start() 
# never runs 
sm.send("e") 

代替,這樣做:

xml = '''\ 
<scxml version="1.0" datamodel="python"> 
    <state id="s1"> 
     <transition event="e" target="f" /> 
    </state> 
    <final id="f" /> 
</scxml> 
''' 
sm = Statemachine(xml) 
sm.start_threaded() 
sm.send("e") 

在運行的statemachine的maineventloop在自己的greenlet,從而使您與互動它在主線程中。 sm.send('e')將會阻止,直到狀態機進入穩定狀態(即直到它正在等待進一步的外部事件)。

+0

好的,所以它在一個單獨的線程上並行運行,但通話阻塞。謝謝澄清! – fabb 2013-02-22 12:44:08

+0

對不起拿走了「接受的答案」,我試着做兩個一個接一個地發送,但是第二個事件甚至在我試過的大多數處決中都沒有被州政府收到。有任何想法嗎? Python 2.7,Win 7 64位,PySCXML 0.8.3。 https://gist.github.com/fabb/5014867 – fabb 2013-02-22 17:00:15

+0

哦,我注意到你是PySCXML - 偉大的東西!我在你的倉庫中創建了一個問題,因爲我猜這是一個錯誤的行爲:https://github.com/jroxendal/PySCXML/issues/3 – fabb 2013-02-23 08:25:57