2012-04-17 14 views
0

私はSimPyを学んでいます。現在は、シミュレーションが終了するまで定期的にメソッドを呼び出す必要があります。SimPyで待たずにイベントをスケジュール通りに定期的に取得する方法は?

私が原因while True:内の文に

import SimPy.Simulation as Simpy 

class mod(Simpy.Process): 
    def do(self): 
     print(Simpy.now(), "Do!") 
     yield Simpy.hold, self, 5.0 

class trigger(Simpy.Process): 
    def ACTIONS(self): 
     while True: 
      for i in self.target.do(): 
       yield i 
      yield Simpy.hold, self, 1.0 

    def set_target(self, tar): 
     self.target = tar 


Simpy.initialize() 
obj = mod() 
tri = trigger() 
tri.set_target(obj) 
tri.start(at=0.0) 
Simpy.simulate(until=100.0) 

ようにそれを書いて、それはすべての1.0時間単位でtarget.do()が得られるはずです。したがって、出力は次のようになります。

0.0 Do! 
1.0 Do! 
2.0 Do! 
...... 

しかし、実際には、それはすべての6.0時間単位でtarget.do()をもたらす(yieldtarget.do()終了するまで待機するように保持している):

0.0 Do! 
6.0 Do! 
12.0 Do! 

私はどうすればよいということだろう私は実行を終了するまで待つことなく、スケジュールに定期的にターゲット関数を出力しますか?

ありがとうございました! ......

答えて

0

OK私は自分でそれを考え出しました。 SimPyのProcessはイベントの一種です。スケジュールされて完了すると、いつでも終了します。あなたがタイムラインにイベントを挿入したい時はいつでもそのため、Processのインスタンスは、新しい 1でなければなりません。換言すれば、Processは、作業方法自体ではなく、使い捨て信号として扱うべきです。

ので、Processは次のようにはなりません。

class Event(Simpy.Process): 
    def call_do(self, subject): 
     subject.do() 

と加工方法は、もはやProcessのインスタンスでなければなりません。時間遅れではなく、ワークフローによって制御されるのでeventを活性化することによって制御する必要があります。

class mod(): 
    def do(self): 
     print(Simpy.now(), "Do!") 

最後に、我々はこのようにそれをスケジュールすることができます。

while True: 
    e = Event() 
    Simpy.activate(e, e.call_do(self.target), delay = 5.0) 
    yield Simpy.hold, self, 1.0 
関連する問題