【问题标题】:How to yield an event periodically into schedule without waiting in SimPy?如何在不等待 SimPy 的情况下定期生成事件?
【发布时间】:2012-04-17 04:27:31
【问题描述】:

我正在学习 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!

我想知道如何才能定期将目标函数生成到计划中,而无需等到它完成执行?

谢谢! ......

【问题讨论】:

    标签: python simpy


    【解决方案1】:

    好吧,我自己想通了。 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 2023-03-16
      • 2018-11-11
      • 2022-07-21
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多