sched — Ereignis-Scheduler¶
Quellcode: Lib/sched.py
Das Modul sched legt eine Klasse fest, die einen Ereignis-Scheduler für allgemeine Zwecke umsetzt:
- class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)¶
Die Klasse
schedulerlegt eine allgemeine Schnittstelle zum Einplanen von Ereignissen fest. Sie braucht zwei Funktionen, um tatsächlich mit der „Außenwelt“ umzugehen: timefunc sollte ohne Argumente aufrufbar sein und eine Zahl zurückgeben (die „Zeit“, in welchen Einheiten auch immer). Die Funktion delayfunc sollte mit einem Argument aufrufbar sein, das zur Ausgabe von timefunc passt, und sollte um so viele Zeiteinheiten verzögern. delayfunc wird außerdem nach jedem ausgeführten Ereignis mit dem Argument0aufgerufen, um in Anwendungen mit mehreren Threads anderen Threads Gelegenheit zum Laufen zu geben.Geändert in Version 3.3: Die Parameter timefunc und delayfunc sind wahlfrei.
Geändert in Version 3.3: Die Klasse
schedulerlässt sich in Umgebungen mit mehreren Threads gefahrlos verwenden.
Beispiel:
>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(a='default'):
... print("From print_time", time.time(), a)
...
>>> def print_some_times():
... print(time.time())
... s.enter(10, 1, print_time)
... s.enter(5, 2, print_time, argument=('positional',))
... # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative
... s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
... s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
... s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
... s.run()
... print(time.time())
...
>>> print_some_times()
1652342830.3640375
From print_time 1652342830.3642538 second enterabs
From print_time 1652342830.3643398 first enterabs
From print_time 1652342835.3694863 positional
From print_time 1652342835.3696074 keyword
From print_time 1652342840.369612 default
1652342840.3697174
Scheduler-Objekte¶
scheduler-Instanzen haben die folgenden Methoden und Attribute:
- scheduler.enterabs(time, priority, action, argument=(), kwargs={})¶
Plant ein neues Ereignis ein. Das Argument time sollte von einem Zahlentyp sein, der zum Rückgabewert der Funktion timefunc passt, die dem Konstruktor übergeben wurde. Ereignisse, die für dieselbe time eingeplant sind, werden in der Reihenfolge ihrer priority ausgeführt. Eine kleinere Zahl steht für eine höhere Priorität.
Das Ereignis auszuführen bedeutet,
action(*argument, **kwargs)auszuführen. argument ist eine Folge mit den Positionsargumenten für action. kwargs ist ein Dictionary mit den Schlüsselwortargumenten für action.Der Rückgabewert ist ein Ereignis, über das sich das Ereignis später abbrechen lässt (siehe
cancel()).Geändert in Version 3.3: Der Parameter argument ist wahlfrei.
Geändert in Version 3.3: Der Parameter kwargs wurde hinzugefügt.
- scheduler.enter(delay, priority, action, argument=(), kwargs={})¶
Plant ein Ereignis für delay weitere Zeiteinheiten ein. Abgesehen von der relativen Zeit sind die übrigen Argumente, die Wirkung und der Rückgabewert dieselben wie bei
enterabs().Geändert in Version 3.3: Der Parameter argument ist wahlfrei.
Geändert in Version 3.3: Der Parameter kwargs wurde hinzugefügt.
- scheduler.cancel(event)¶
Entfernt das Ereignis aus der Warteschlange. Ist event kein Ereignis, das aktuell in der Warteschlange steht, löst diese Methode ein
ValueErroraus.
- scheduler.empty()¶
Gibt
Truezurück, wenn die Ereigniswarteschlange leer ist.
- scheduler.run(blocking=True)¶
Führt alle eingeplanten Ereignisse aus. Diese Methode wartet (über die Funktion delayfunc, die dem Konstruktor übergeben wurde) auf das nächste Ereignis, führt es dann aus und so weiter, bis keine eingeplanten Ereignisse mehr vorhanden sind.
Ist blocking falsch, werden sofort alle Ereignisse in der Warteschlange ausgeführt, deren Zeitwert kleiner oder gleich dem aktuellen Wert von timefunc ist (sofern es solche gibt), und die Differenz zwischen dem aktuellen Wert von timefunc und dem Zeitwert des nächsten eingeplanten Ereignisses in der Ereigniswarteschlange des Schedulers zurückgegeben. Ist die Warteschlange leer, wird
Nonezurückgegeben.Sowohl action als auch delayfunc können eine Ausnahme auslösen. In beiden Fällen hält der Scheduler einen widerspruchsfreien Zustand und gibt die Ausnahme weiter. Löst action eine Ausnahme aus, wird das Ereignis in künftigen Aufrufen von
run()nicht mehr versucht.Braucht eine Folge von Ereignissen länger als die Zeit, die bis zum nächsten Ereignis verfügbar ist, fällt der Scheduler einfach zurück. Es werden keine Ereignisse verworfen. Der aufrufende Code ist dafür zuständig, Ereignisse abzubrechen, die nicht mehr einschlägig sind.
Geändert in Version 3.3: Der Parameter blocking wurde hinzugefügt.
- scheduler.queue¶
Nur lesbares Attribut, das eine Liste der bevorstehenden Ereignisse in der Reihenfolge zurückgibt, in der sie ausgeführt werden. Jedes Ereignis wird als benanntes Tupel mit den folgenden Feldern dargestellt: time, priority, action, argument, kwargs.