使用callb启动simpy模拟运行

2024-10-01 18:38:47 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从回调中编写一些模拟代码(包括等待事件)?在

将我的过程简化为最简单的示例,我想在simpy模拟中发生事件时启动一些可执行代码。我所做的是将可执行代码设置为事件的回调。可执行代码本身有一些简单的事件处理,特别是超时。在我的实际代码中,这发生在一个进程中,但是这个简化版本(其中event在main中)显示了相同的问题行为:

import simpy
if __name__ == '__main__':
    env = simpy.Environment()

    def simulationRun(event):
        print("Starting a run at time [%i]" % env.now)
        yield env.timeout(5)
        print("Ending a run at time [%i]" % env.now)

    event = env.timeout(5)
    event.callbacks.append(simulationRun)

    print("Starting simulation.")
    env.run(20)
    print("End of simulation.")

我的预期产出是:

^{pr2}$

但是,我的实际输出是:

Starting simulation.
End of simulation.

当我删除yield命令时,我得到:

Starting simulation.
Starting a run at time [5]
Ending a run at time [5]
End of simulation.

显然回调设置正确,但关键是模拟simulationRun中的超时。如何在回调的代码中运行一些模拟代码(包括等待事件)?在

它使用python3.4.2和simpy。在


Tags: ofrun代码enveventtimemain事件
2条回答

问题是回调不是一个进程,因此它在simpy模拟引擎中的运行方式不能让引擎停止并重新启动。你需要的是一个过程。您可以通过从单独的回调函数启动当前的simulationRun进程,如下所示。在

import simpy  

if __name__ == '__main__':
    env = simpy.Environment()

    def simulationRun():
        print("Starting a run at time [%i]" % env.now)
        yield env.timeout(5)
        print("Ending a run at time [%i]" % env.now)

    def callback(event):
        s = simulationRun()
        env.process(s)

    event = env.timeout(5)
    event.callbacks.append(callback)

    print("Starting simulation.")
    env.run(20)
    print("End of simulation.")

您不应该直接处理回调。最好的做法是使用另一个 为您启动simulation_run()的进程:

import simpy


def simulation_run(env):
    print("Starting a run at time [%i]" % env.now)
    yield env.timeout(5)
    print("Ending a run at time [%i]" % env.now)


def starter(env):
    yield env.timeout(5)
    env.process(simulation_run(env))


if __name__ == '__main__':
    env = simpy.Environment()
    env.process(starter(env))
    print("Starting simulation.")
    env.run(20)
    print("End of simulation.")

因为这是一个相对常见的模式,所以我们在 SimPy就是这样做的:

^{pr2}$

注意:您应该始终将对环境的引用传递到您的流程中 而不是使用全局范围的。这看起来很无聊,但是你 如果以后重新构造或重构代码,可能会遇到任何类型的问题 全球环境不再是你所期望的或者不再可用。在

相关问题 更多 >

    热门问题