Anonymous
Почему результат меняется после помещения кода в функцию в простом процессе?
Сообщение
Anonymous » 09 дек 2024, 16:01
В простом процессе я обрабатываю простое прерывание. Я делаю это в двух местах и поэтому хочу поместить код обработки в функцию. До помещения в функцию все работает хорошо, после помещения в функцию результаты разные.
Ниже написанный код
Код: Выделить всё
def offer(env, simpy_car, simpy_tankcar, route, timestep):
action = None
t_prev = -1
for lat in route:
try:
# fuel consumption during timestep unequal to one hour
# it is assumed that each simpy timestep equals one hour
t = env.now
fuel = simpy_car.power * (t - t_prev) * 3600 / (E_OIL * EFFICIENCY)
t_prev = t
yield env.process(simpy_car.consume(env, timestep, fuel, lat))
except sp.Interrupt as e:
action = e.cause
while True:
try:
if action == 'weather':
yield env.process(simpy_car.refuel(env, simpy_tankcar))
elif action == 'tanking':
yield env.process(simpy_car.tanking(env, simpy_tankcar))
simpy_car.status = 'DRIVING'
elif action == 'refuelling':
simpy_tankcar.status = 'DRIVING'
simpy_car.status = 'DRIVING'
action = None
break
except sp.Interrupt as e:
action = e.cause
try:
yield env.process(simpy_car.check_fuel(env, simpy_tankcar))
except sp.Interrupt as e:
action = e.cause
while True:
try:
if action == 'weather':
yield env.process(simpy_car.refuel(env, simpy_tankcar))
elif action == 'tanking':
yield env.process(simpy_car.tanking(env, simpy_tankcar))
simpy_car.status = 'DRIVING'
elif action == 'refuelling':
simpy_tankcar.status = 'DRIVING'
simpy_car.status = 'DRIVING'
action = None
break
except sp.Interrupt as e:
action = e.cause
yield from ()
Ниже код с функцией и вызовами функций
Код: Выделить всё
def process_interrupt(action, simpy_car, simpy_tankcar):
"""
State machine
"""
while True:
try:
if action == 'weather':
yield env.process(simpy_car.refuel(env, simpy_tankcar))
elif action == 'tanking':
yield env.process(simpy_car.tanking(env, simpy_tankcar))
simpy_car.status = 'DRIVING'
elif action == 'refuelling':
simpy_tankcar.status = 'DRIVING'
simpy_car.status = 'DRIVING'
action = None
break
except sp.Interrupt as e:
action = e.cause
return action
def offer(env, simpy_car, simpy_tankcar, route, timestep):
action = None
t_prev = -1
for lat in route:
try:
t = env.now
fuel = simpy_car.power * (t - t_prev) * 3600 / (E_OIL * EFFICIENCY)
t_prev = t
yield env.process(simpy_car.consume(env, timestep, fuel, lat))
except sp.Interrupt as e:
action = e.cause
action = process_interrupt(action, simpy_car, simpy_tankcar)
try:
yield env.process(simpy_car.check_fuel(env, simpy_tankcar))
except sp.Interrupt as e:
action = e.cause
action = process_interrupt(action, simpy_car, simpy_tankcar)
yield from ()
Я ожидаю, что обе версии дадут одинаковые результаты, но это не так. Что я делаю неправильно? Почему версия функции дает разные результаты?
Подробнее здесь:
https://stackoverflow.com/questions/792 ... py-process
1733749319
Anonymous
В простом процессе я обрабатываю простое прерывание. Я делаю это в двух местах и поэтому хочу поместить код обработки в функцию. До помещения в функцию все работает хорошо, после помещения в функцию результаты разные. Ниже написанный код [code]def offer(env, simpy_car, simpy_tankcar, route, timestep): action = None t_prev = -1 for lat in route: try: # fuel consumption during timestep unequal to one hour # it is assumed that each simpy timestep equals one hour t = env.now fuel = simpy_car.power * (t - t_prev) * 3600 / (E_OIL * EFFICIENCY) t_prev = t yield env.process(simpy_car.consume(env, timestep, fuel, lat)) except sp.Interrupt as e: action = e.cause while True: try: if action == 'weather': yield env.process(simpy_car.refuel(env, simpy_tankcar)) elif action == 'tanking': yield env.process(simpy_car.tanking(env, simpy_tankcar)) simpy_car.status = 'DRIVING' elif action == 'refuelling': simpy_tankcar.status = 'DRIVING' simpy_car.status = 'DRIVING' action = None break except sp.Interrupt as e: action = e.cause try: yield env.process(simpy_car.check_fuel(env, simpy_tankcar)) except sp.Interrupt as e: action = e.cause while True: try: if action == 'weather': yield env.process(simpy_car.refuel(env, simpy_tankcar)) elif action == 'tanking': yield env.process(simpy_car.tanking(env, simpy_tankcar)) simpy_car.status = 'DRIVING' elif action == 'refuelling': simpy_tankcar.status = 'DRIVING' simpy_car.status = 'DRIVING' action = None break except sp.Interrupt as e: action = e.cause yield from () [/code] Ниже код с функцией и вызовами функций [code]def process_interrupt(action, simpy_car, simpy_tankcar): """ State machine """ while True: try: if action == 'weather': yield env.process(simpy_car.refuel(env, simpy_tankcar)) elif action == 'tanking': yield env.process(simpy_car.tanking(env, simpy_tankcar)) simpy_car.status = 'DRIVING' elif action == 'refuelling': simpy_tankcar.status = 'DRIVING' simpy_car.status = 'DRIVING' action = None break except sp.Interrupt as e: action = e.cause return action def offer(env, simpy_car, simpy_tankcar, route, timestep): action = None t_prev = -1 for lat in route: try: t = env.now fuel = simpy_car.power * (t - t_prev) * 3600 / (E_OIL * EFFICIENCY) t_prev = t yield env.process(simpy_car.consume(env, timestep, fuel, lat)) except sp.Interrupt as e: action = e.cause action = process_interrupt(action, simpy_car, simpy_tankcar) try: yield env.process(simpy_car.check_fuel(env, simpy_tankcar)) except sp.Interrupt as e: action = e.cause action = process_interrupt(action, simpy_car, simpy_tankcar) yield from () [/code] Я ожидаю, что обе версии дадут одинаковые результаты, но это не так. Что я делаю неправильно? Почему версия функции дает разные результаты? Подробнее здесь: [url]https://stackoverflow.com/questions/79265067/why-does-the-output-change-after-putting-code-in-a-function-in-a-simpy-process[/url]