如何在没有等待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