HOWTO · Python

In Python 5 Sekunden warten

Dieses Tutorial erklärt, wie Sie in Python 5 Sekunden warten.

Auf dieser Seite

In gewöhnlichem synchronem Python-Code pausiert time.sleep(5) den aktuellen Thread für etwa fünf Sekunden. Verwenden Sie threading.Event, wenn ein anderer Thread das Warten vorzeitig beenden können soll, threading.Timer für einen verzögerten Callback, asyncio.sleep() innerhalb einer Coroutine oder sched, wenn Sie geplante Ereignisse ausführen müssen.

Mit der Funktion time.sleep() in Python 5 Sekunden warten

Die Funktion time.sleep() erwartet eine Dauer in Sekunden und hält den aufrufenden Thread an. Die Dauer kann auch ein Bruchteil einer Sekunde sein, zum Beispiel 0.5. Fünf Sekunden sind jedoch eine angeforderte Mindestwartezeit und keine Garantie dafür, dass der Thread exakt dann fortgesetzt wird. Die Planung durch das Betriebssystem kann die tatsächliche Pause verlängern.

Dieses eigenständige Beispiel gibt vor und nach der Pause eine Meldung aus:

import time

print("Waiting")
time.sleep(5)
print("Finished")
Waiting
Finished

Diese Variante eignet sich für ein einfaches synchrones Skript. Während der Thread wartet, kann er keine andere Arbeit erledigen. Eine gewöhnliche Tastaturunterbrechung, etwa mit Strg+C, kann das Warten abbrechen. Eine eigene Signalbehandlung ist für diesen Anwendungsfall normalerweise nicht nötig.

Mit der Klasse threading.Event in Python 5 Sekunden warten

threading.Event ist ein Werkzeug zur Koordination von Threads. Der Aufruf wait(5) blockiert den aufrufenden Thread bis zu fünf Sekunden lang und kehrt früher zurück, wenn ein anderer Thread zuvor das Ereignis setzt. Das ist nützlich, wenn ein Worker entweder auf ein Signal oder auf den Ablauf einer Wartezeit reagieren soll.

import threading

ready = threading.Event()
print("Waiting")
ready.wait(5)
print("Finished")
Waiting
Finished

Da in diesem Beispiel kein anderer Thread ready setzt, wartet der Aufruf bis zum Ablauf der Zeit. In einem Programm mit mehreren beteiligten Threads kann ein anderer Thread den Wartenden mit ready.set() aufwecken. Prüfen Sie den Rückgabewert von wait(), wenn der nächste Schritt davon abhängt, ob das Ereignis vor dem Timeout gesetzt wurde.

Mit der Klasse threading.Timer einen Callback verzögert ausführen

threading.Timer ist eine Klasse, die einen eigenen Thread startet und nach einer Verzögerung einen Callback aufruft. Sie pausiert nicht den Thread, der sie gestartet hat. Wenn ein kurzes Skript auf den Callback warten soll, halten Sie den Timer mit join() am Leben, bis er beendet ist. Rufen Sie cancel() auf, falls der Callback vor seinem Start nicht mehr benötigt wird.

from threading import Timer


def report():
    print("Callback ran")


print("Timer started")
timer = Timer(5, report)
timer.start()
timer.join()
print("Main thread finished")
Timer started
Callback ran
Main thread finished

Der Callback läuft im Timer-Thread; join() lässt den Hauptthread warten, bis dieser Thread beendet ist. Ein Timer plant einen einzelnen Callback. Für wiederholte oder mehrere Ereignisse verwenden Sie eine Schleife oder einen Scheduler.

Mit asyncio.sleep() in asynchronem Code in Python 5 Sekunden warten

In asynchronem Code hält await asyncio.sleep(5) die aktuelle Coroutine an und gibt dem Event-Loop zugleich Gelegenheit, andere Tasks auszuführen. Anders als time.sleep(5) blockiert der Aufruf nicht den Thread des Event-Loops.

import asyncio


async def main():
    print("Waiting")
    await asyncio.sleep(5)
    print("Finished")


asyncio.run(main())
Waiting
Finished

Verwenden Sie asyncio.run(main()), um dieses eigenständige Skript zu starten. In einer Anwendung, deren Event-Loop bereits läuft, rufen Sie die Coroutine innerhalb dieses Loops auf oder planen sie dort ein, statt mit asyncio.run() einen weiteren Loop zu starten.

Mit dem Modul sched in Python 5 Sekunden warten

Das Modul sched stellt einen allgemeinen Ereignis-Scheduler bereit. Fügen Sie ein Ereignis mit Verzögerung, Priorität, Callback und optionalen Argumenten hinzu und rufen Sie anschließend run() auf, um die Warteschlange abzuarbeiten. Liegt das nächste Ereignis noch in der Zukunft, wartet run() bis zu dessen geplantem Zeitpunkt. Das eignet sich zum Verwalten geplanter Ereignisse, ist für eine einmalige Pause jedoch aufwendiger als nötig.

import sched
import time


def report():
    print("Scheduled event ran")


scheduler = sched.scheduler(time.monotonic, time.sleep)
print("Scheduler started")
scheduler.enter(5, 1, report)
scheduler.run()
print("Scheduler finished")
Scheduler started
Scheduled event ran
Scheduler finished

Der Scheduler verwendet eine monotone Uhr. Daher wird die Zeitmessung für verstrichene Zeit nicht durch Änderungen der Systemuhr beeinflusst. Als Wartefunktion dient time.sleep; run() kehrt erst zurück, nachdem das eingereihte Ereignis ausgeführt wurde.

Fazit

Wählen Sie time.sleep(5) für eine einfache synchrone Pause. Verwenden Sie threading.Event.wait(5), wenn ein anderer Thread den Wartenden benachrichtigen können soll, threading.Timer für einen einzelnen späteren Callback, asyncio.sleep(5) innerhalb einer Coroutine, damit andere Tasks weiterlaufen können, und sched zum Verwalten eines oder mehrerer zeitgesteuerter Ereignisse. Alle Wartezeiten sind Näherungswerte, da das Betriebssystem beziehungsweise der Event-Loop bestimmt, wann der wartende Code wieder ausgeführt wird.