如何在没有等待SimPy的情况下定期生成活动?

问题描述:

我正在学习SimPy。目前我需要定期调用一个方法,直到模拟结束。如何在没有等待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:,应该每隔1.0单位时间产生target.do()。因此,输出应该是:

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

但实际上,它通过每6.0单位时间产生target.do()(在yield持有等到target.do()完成):

0.0 Do! 
6.0 Do! 
12.0 Do! 

不知怎么可能我定期将目标函数放入日程安排中,而不必等到执行完成为止?

谢谢! ......

好的我自己想清楚了。在SimPy中的Process是一种事件。每当它被安排并完成时,它将被终止。因此,无论何时要将事件插入到时间线中,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