0

私はSimPyを学んでいます。現在、シミュレーションが終了するまで定期的にメソッドを呼び出す必要があります。

みたいに書きました

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 時間単位ごとwhile True:に が得られるはずです。target.do()したがって、出力は次のようになります。

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

しかし実際には、target.do()6.0 時間単位ごとに結果が得られます (終了yieldするまで待機するホールドtarget.do())。

0.0 Do!
6.0 Do!
12.0 Do!

実行が完了するまで待たずに、ターゲット関数を定期的にスケジュールに渡すにはどうすればよいでしょうか?

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

4

1 に答える 1

0

わかりました、私は自分でそれを理解しました。SimPyの AProcessは、イベントとしての一種のものです。スケジュールされてから完了すると、いつでも終了します。したがって、タイムラインにイベントを挿入するときはいつでも、のインスタンスは新しいProcessものでなければなりません。言い換えれば、は、動作するメソッド自体ではなく、使い捨てのシグナルとして扱われるべきです。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
于 2012-04-17T11:05:26.807 に答える