Simpy - Schritt-Reihenfolge
Verfasst: Sonntag 6. Juni 2021, 22:06
Ich experimentiere an der Simpy-Schritt-Reihenfolge herum. Dabei geht es mir speziell um folgenden Hinweis auf der Simpy-Homepage: If a process function yields an event, SimPy adds the process to the event’s callbacks and suspends the process until the event is triggered and processed.
Ich verstehe das so, dass ein Prozess bei jedem generierten Event (z.B. time-out) suspendiert wird - und an der entsprechenden Stelle wieder aufgenommen, sobald das generierte Event getriggert und verarbeitet ist.
Allerdings kann ich das nicht mit nachfolgendem Listing in Einklang bringen (stammt von der Simpy-Homepage). Mal wechselt Simpy nach einem time-out-yield in den jeweils anderen Prozess, mal bleibt es im gleichen. Ich kann keine Regelhaftigkeit feststellen. Allerdings habe ich auch keine Zweifel, dass einer der Experten sofort sieht, woran das liegt ... Vielen Dank im Voraus!
Ich verstehe das so, dass ein Prozess bei jedem generierten Event (z.B. time-out) suspendiert wird - und an der entsprechenden Stelle wieder aufgenommen, sobald das generierte Event getriggert und verarbeitet ist.
Allerdings kann ich das nicht mit nachfolgendem Listing in Einklang bringen (stammt von der Simpy-Homepage). Mal wechselt Simpy nach einem time-out-yield in den jeweils anderen Prozess, mal bleibt es im gleichen. Ich kann keine Regelhaftigkeit feststellen. Allerdings habe ich auch keine Zweifel, dass einer der Experten sofort sieht, woran das liegt ... Vielen Dank im Voraus!
Code: Alles auswählen
from random import seed, randint
seed(23)
import simpy
class EV:
def __init__(self, env):
self.env = env
self.drive_proc = env.process(self.drive(env))
self.bat_ctrl_proc = env.process(self.bat_ctrl(env))
self.bat_ctrl_reactivate = env.event()
def drive(self, env):
while True:
# Drive for 20-40 min
yield env.timeout(randint(20, 40))
# Park for 1–6 hours
print('Start parking at', env.now)
self.bat_ctrl_reactivate.succeed() # "reactivate"
self.bat_ctrl_reactivate = env.event()
yield env.timeout(randint(60, 360))
print('Stop parking at', env.now)
def bat_ctrl(self, env):
while True:
print('Bat. ctrl. passivating at', env.now)
yield self.bat_ctrl_reactivate # "passivate"
print('Bat. ctrl. reactivated at', env.now)
# Intelligent charging behavior here …
yield env.timeout(randint(30, 90))
env = simpy.Environment()
ev = EV(env)
env.run(until=900)