Simpy - Schritt-Reihenfolge

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hcshm
User
Beiträge: 48
Registriert: Dienstag 11. Februar 2020, 08:23

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!

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)
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Hallo hcshm,

Beide Prozesse werden in der while -True Schleife fortlaufend abgearbeitet.
Man kann also nicht wirklich sagen, dass zwischen den Prozessen gewechselt wird. Durch die zufälligen Timeouts kann es aber zu einer veränderten Reihenfolge im Ablauf kommen.

Passivating beginnt sofort, da kein Timeout
Parking beginnt verzögert durch den Timeout
Sofort nach Parking wird der nächste Schritt in bat_ctrl ausgeführt: Reactivating

Der drive Prozess und der bat_ctrl Prozess hängen jetzt beide im Timeout und es kann passieren, wenn auch mit geringer Wahrscheinlichkeit, dass der Timeout des drive Prozesses früher beendet wird als der Timeout im bat_ctrl Prozess.

Da: bat_ctrl Timeout 30 - 90 und drive Timeout 60 - 360. Nach 60 Zeiteinheiten kann also 'stop parking' kommen ohne das 'passivating' erreicht wurde.

Grundsätzlich laufen beide Prozesse unabhängig, nur dass durch den Event im drive Prozess der bat_ctrl Prozess gesteuert werden.

Ich hoffe so umgangssprachlich ausgedrückt, macht das Sinn.

Sonst kannst du vielleicht mal deine Ausgabe posten und sagen was konkret du anders erwarten würdest.
Antworten