SimPy

SimPy ist ein Framework für diskrete Ereignissimulation mit Prozessen, Interprozessinteraktionen und geteilten Ressourcen.

Prozesse werden als Funktionen definiert, welche mittels yield pausiert werden können. Diese werden einem Scheduler (Environment) übergeben, welcher sie bis zu einem bestimmten Zeitpunkt ausführt (env.run). Ein Prozess kann entweder nach Abschluss seiner Aufgabe sich selbst beenden (d.h. die Funktion kehrt zurück) oder endet mit dem Ende der Simulation (d.h. die Funktion ist beinhaltet eine Endlosschlaufe).

Geteilte Ressourcen können mit request angefordert und release wieder freigegeben werden (alternativ kann auch ein with verwendet werden). Sobald eine Ressource angefordert wurde, muss mit yield gewartet werden, bis sie verfügbar ist.

from random import expovariate, triangular
from simpy import Environment, Resource

def customer(env):
    with env.coffee_machine.request() as request:
        # waiting for coffee machine
        yield request

        # waiting for coffee
        yield env.timeout(triangular(10, 30, 15))

def generate_customer(env):
    while True:
        # create a new customer
        env.process(customer(env))

        # wait for next customer to arrive
        yield env.timeout(expovariate(50/(60*60)))

env = Environment()
env.coffee_machine = Resource(env)
env.process(generate_customer(env))
env.run(until=60*60)

Das Beispiel simuliert das Anstehen an einer Kaffeemaschine. Die Simulation hat zwei Prozesse: customer und generate_customer.

  • customer modelliert das Verhalten eines Kunden: Anstehen vor der Kaffeemaschine und warten bis diese frei wird, anschliessend Kaffezubereitung mit einer zufälligen, triangular-verteilten Wartezeit.
  • generate_customer modelliert das exponentiell verteilte Eintreffen von neuen Kunden.

Nachdem der Scheduler, die Kaffeemaschine und der Prozess zum Erzeugen von Kunden erzeugt wurde, wir die Simulation für 60x60 Sekunden ausgeführt.

Mehr Informationen auf simpy.readthedocs.io

Beispiele mit Anwendungsfällen in unserem Blog.