为什么这个简单的中断示例不起作用

时间:2018-10-27 22:40:00

标签: python python-3.6 simpy

我最近在Win10计算机上下载并安装了Python 3.6-64位的Anaconda / Spyder,并安装了simpy,以尝试了解有关离散事件模拟的更多信息。我是simpy,python和面向对象程序的新手,所以我的问题听起来很愚蠢。

文档中的第一个示例是被另一个进程中断的car示例。我复制了此示例(如下所示)并成功运行了它。但是,如果我将驱动程序功能的超时时间从3更改为6,脚本将崩溃。我认为模拟将以中断时间6进行的方式是,该中断将在时间= 5开始的第二次充电事件中发生。相反,脚本将崩溃,并显示以下输出。有人可以向我解释为什么这行不通吗?

错误

  

runfile('C:/ Users / admin / Documents / Python   脚本/carSimInterruptRevA.py',wdir ='C:/ Users / admin / Documents / Python   脚本)从0开始停车和充电从5开始追溯   (最近通话最近):

     

文件“”,第1行,在       runfile('C:/ Users / admin / Documents / Python Scripts / carSimInterruptRevA.py',wdir ='C:/ Users / admin / Documents / Python   脚本”)

     

文件   “ C:\ Users \ admin \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py”,   运行文件中的第668行       execfile(文件名,命名空间)

     

文件   “ C:\ Users \ admin \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py”,   execfile中的第108行       exec(compile(f.read(),文件名,'exec'),命名空间)

     

文件“ C:/ Users / admin / Documents / Python   脚本/carSimInterruptRevA.py”,第38行,在       env.run(until = 30)

     

文件“ C:\ Users \ admin \ Anaconda3 \ lib \ site-packages \ simpy \ core.py”,   138行,正在运行       self.step()

     

文件“ C:\ Users \ admin \ Anaconda3 \ lib \ site-packages \ simpy \ core.py”,   230行,在步骤       提高经验

     

中断:中断(无)I

示例代码

import simpy
def driver(env, car):
    yield env.timeout(3)
    car.action.interrupt()

class Car(object):
    def __init__(self, env):
        self.env = env
        self.action = env.process(self.run())

    def run(self):
        while True:
            print('Start parking and charging at %d' % self.env.now)
            charge_duration = 5
            # We may get interrupted while charging the battery
            try:
                yield self.env.process(self.charge(charge_duration))
            except simpy.Interrupt:
                # When we received an interrupt, we stop charging and
                # switch to the "driving" state
                print('Was interrupted. Hope, the battery is full enough ...')

            print('Start driving at %d' % self.env.now)
            trip_duration = 2
            yield self.env.timeout(trip_duration)
    def charge(self, duration):
        yield self.env.timeout(duration)

env = simpy.Environment()
car = Car(env)
env.process(driver(env, car))
env.run(until=30)

0 个答案:

没有答案