sched — Ereignisplaner¶
Quellcode: Lib/sched.py
Das Modul sched definiert eine Klasse, die einen Allzweck-Ereignisplaner implementiert.
- class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)¶
Die Klasse
schedulerdefiniert eine generische Schnittstelle zur Planung von Ereignissen. Sie benötigt zwei Funktionen, um tatsächlich mit der „Außenwelt“ umzugehen – timefunc sollte ohne Argumente aufrufbar sein und eine Zahl zurückgeben (die „Zeit“, in beliebigen Einheiten). Die Funktion delayfunc sollte mit einem Argument aufrufbar sein, das mit der Ausgabe von timefunc kompatibel ist, und sollte diese vielen Zeiteinheiten verzögern. delayfunc wird auch mit dem Argument0aufgerufen, nachdem jedes Ereignis ausgeführt wurde, um anderen Threads die Möglichkeit zu geben, in Multithreading-Anwendungen zu laufen.Geändert in Version 3.3: Die Parameter timefunc und delayfunc sind optional.
Geändert in Version 3.3: Die Klasse
schedulerkann sicher in Multithreading-Umgebungen verwendet werden.
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¶
Instanzen von scheduler haben die folgenden Methoden und Attribute:
- scheduler.enterabs(time, priority, action, argument=(), kwargs={})¶
Plant ein neues Ereignis. Das Argument time sollte ein numerischer Typ sein, der mit dem Rückgabewert der timefunc-Funktion, die dem Konstruktor übergeben wurde, kompatibel ist. Ereignisse, die für die gleiche time geplant sind, werden in der Reihenfolge ihrer priority ausgeführt. Eine niedrigere Zahl stellt eine höhere Priorität dar.
Das Ausführen des Ereignisses bedeutet die Ausführung von
action(*argument, **kwargs). argument ist eine Sequenz, die die Positionsargumente für action enthält. kwargs ist ein Wörterbuch, das die Schlüsselwortargumente für action enthält.Der Rückgabewert ist ein Ereignis, das für die spätere Stornierung des Ereignisses verwendet werden kann (siehe
cancel()).Geändert in Version 3.3: Das Argument argument ist optional.
Geändert in Version 3.3: Das Argument kwargs wurde hinzugefügt.
- scheduler.enter(delay, priority, action, argument=(), kwargs={})¶
Plant ein Ereignis für delay weitere Zeiteinheiten. Abgesehen von der relativen Zeit sind die anderen Argumente, die Auswirkung und der Rückgabewert die gleichen wie bei
enterabs().Geändert in Version 3.3: Das Argument argument ist optional.
Geändert in Version 3.3: Das Argument kwargs wurde hinzugefügt.
- scheduler.cancel(event)¶
Entfernt das Ereignis aus der Warteschlange. Wenn event kein derzeit in der Warteschlange befindliches Ereignis ist, löst diese Methode einen
ValueErroraus.
- scheduler.empty()¶
Gibt
Truezurück, wenn die Ereigniswarteschlange leer ist.
- scheduler.run(blocking=True)¶
Führt alle geplanten Ereignisse aus. Diese Methode wartet (unter Verwendung der Funktion delayfunc, die an den Konstruktor übergeben wurde) auf das nächste Ereignis, führt es dann aus und so weiter, bis keine geplanten Ereignisse mehr vorhanden sind.
Wenn blocking false ist, werden die bald ablaufenden geplanten Ereignisse (falls vorhanden) ausgeführt und dann die Frist des nächsten geplanten Aufrufs im Scheduler (falls vorhanden) zurückgegeben.
Entweder action oder delayfunc kann eine Ausnahme auslösen. In jedem Fall behält der Scheduler einen konsistenten Zustand bei und leitet die Ausnahme weiter. Wenn eine Ausnahme von action ausgelöst wird, wird das Ereignis bei zukünftigen Aufrufen von
run()nicht mehr versucht.Wenn eine Sequenz von Ereignissen länger dauert als die verfügbare Zeit bis zum nächsten Ereignis, wird der Scheduler einfach hinterherhinken. Es werden keine Ereignisse verworfen; der aufrufende Code ist dafür verantwortlich, Ereignisse zu stornieren, die nicht mehr relevant sind.
Geändert in Version 3.3: Das Argument blocking wurde hinzugefügt.
- scheduler.queue¶
Schreibgeschütztes Attribut, das eine Liste anstehender Ereignisse in der Reihenfolge zurückgibt, in der sie ausgeführt werden. Jedes Ereignis wird als benannte Tupel mit den folgenden Feldern dargestellt: time, priority, action, argument, kwargs.