почему этот простой пример прерывания не работает - PullRequest
0 голосов
/ 28 октября 2018

Я недавно скачал и установил Anaconda / Spyder с Python 3.6-64 бит на компьютере Win10 и установил просто, чтобы попытаться узнать больше о моделировании дискретных событий.Я новичок в простой, Python и объектно-ориентированной программе, поэтому мой вопрос может показаться довольно глупым.

Одним из первых примеров в документации является пример машины, прерванный другим процессом.Я скопировал этот пример (показанный ниже) и успешно запустил его.Но если я изменил тайм-аут в функции драйвера с 3 на 6, скрипт вылетает.То, как я думал, что симуляция будет продолжаться со временем прерывания 6, будет состоять в том, что прерывание произойдет во втором событии зарядки, которое начинается во время = 5.Вместо этого скрипт вылетает со следующим выводом.Может кто-нибудь объяснить мне, почему это не работает?

Ошибка

runfile ('C: / Users / admin / Documents / Python Scripts / /carSimInterruptRevA.py ', wdir =' C: / Users / admin / Documents / Python Scripts ') Начать парковку и зарядку с 0 Начать движение с 5 Traceback (последний вызов был последним):

File "", строка1 в runfile ('C: / Users / admin / Documents / Python Scripts / carSimInterruptRevA.py', wdir = 'C: / Users / admin / Documents / Python Scripts')

Файл "C: \Users \ admin \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py ", строка 668, в исполняемом файле исполняемого файла (имя файла, пространство имен)

Файл" C: \ Users \ admin \ Anaconda3 \ lib\ site-packages \ spyder_kernels \ customize \ spydercustomize.py ", строка 108, в execfile exec (compile (f.read (), filename, 'exec'), пространство имен)

Файл" C: / Users "/ admin / Documents / Python Scripts / carSimInterruptRevA.py ", строка 38, в env.run (до = 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, в шаге повышение exc

Прерывание: Прерывание (Нет) 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)
...