2

私は現在、Pythonのイディオムとライブラリを調べて、制御タスクのステートマシンの設計を支援しています。

私はこの他のSOの質問で良い提案を見つけました:Pythonステートマシンの設計。回答の中で、StateChartXMLファイルの解釈を可能にするPySCXMLが提案されました。

PySCXMLのreadmeからの次の文に関心があります。

StateMachineインスタンスのsendメソッドを使用して、ステートマシンにイベントを送信できます[...]もちろん、別のスレッドから送信する必要があります

これは、ステートマシンの処理を同期的に実行できないことを意味しますか?

制御タスクでのPySCXMLの使用を想像しているので:

  1. 入力を読み込む
  2. 入力をステートマシンドメインの抽象入力変数に変換します
  3. 変数をPySCXMLステートマシンインスタンスに送信します
  4. PySCXMLステートマシンインスタンスは新しい状態を計算し、抽象出力変数を設定します
  5. 抽象出力変数を出力に変換します
  6. 出力を書き出す
  7. 次まで寝る

(これがPySCXMLで可能であれば、シーケンスロジック全体をSCXMLファイルに完全に分離できます。)すべてのステップを順番に処理する必要があります。特に4.非同期で実行することはできません。

4

1 に答える 1

3

あなたがやろうとしていることはかなり可能です。これがうまくいかないのは事実ですが:

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")

独自の greenlet で statemachine の maineventloop を実行し、メイン スレッドでそれを操作できるようにします。sm.send('e')ステートマシンが安定状態になるまで (つまり、さらなる外部イベントを待つまで) ブロックします。

于 2013-02-22T11:32:44.030 に答える