我最近在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)