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)

由于 中的陈述while True:,它应该产生target.do()每 1.0 个时间单位。因此输出应该是:

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 回答