Manchmal muss ein Programm eine kurze Pause einlegen — zum Beispiel, um auf Daten zu warten, dem Benutzer Zeit zur Eingabe zu geben oder die Systemlast zu verringern. Eine der einfachsten Möglichkeiten, dies in Python zu erreichen, ist die Funktion time.sleep(), die die Programmausführung für ein bestimmtes Zeitintervall anhält.
In diesem Artikel sehen wir uns an, wie time.sleep() in Python funktioniert, welche Besonderheiten und Alternativen es gibt und welche typischen Fehler auftreten können. Außerdem besprechen wir, wann der Einsatz in mehrthreadigen und asynchronen Programmen sinnvoll ist — und wann besser asyncio.sleep() oder andere Warte-Mechanismen verwendet werden sollten.
Die Funktion sleep() wurde in die Standardbibliothek von Python aufgenommen, um das Erstellen von Pausen im Code zu vereinfachen. Sie befindet sich im Modul time und wird als time.sleep() aufgerufen. Damit kann die Programmausführung für eine bestimmte Anzahl von Sekunden angehalten werden.
In der Praxis ist sleep() nützlich für kurze Pausen in Testumgebungen, Verzögerungen zwischen API-Anfragen oder Zeitintervalle beim Senden von Nachrichten. Man darf sie jedoch nicht mit Systemfunktionen wie Thread-Synchronisation oder präzisem Timing verwechseln — dafür gibt es spezialisierte Werkzeuge.
Die Funktion time.sleep() pausiert den aktuellen Thread für die angegebene Anzahl von Sekunden. In einem mehrthreadigen Programm laufen andere Threads weiter, während der Thread, in dem time.sleep() aufgerufen wurde, „eingefroren“ bleibt.
Wichtig: time.sleep() blockiert die Codeausführung an dieser Stelle — alle nachfolgenden Operationen werden verzögert. Wenn man das ignoriert, kann dies zu Leistungseinbußen oder einer eingefrorenen Benutzeroberfläche in Desktop-Anwendungen führen.
Die Funktion wird am häufigsten in Tests und Debugging-Szenarien eingesetzt, wenn eine kurze Verzögerung erforderlich ist — zum Beispiel, um die Antwort einer API zu überprüfen oder auf eine Serverreaktion zu warten. Außerdem wird sie genutzt, um Skripte schrittweise auszuführen, dem Benutzer Zeit zum Lesen oder Eingeben zu geben oder Prozesse in Demos zu simulieren.
Bei externen Diensten hilft time.sleep(), Sperren oder Rate-Limits durch zu häufige Anfragen zu vermeiden. Es ist jedoch nicht die einzige Möglichkeit, den Code zu verlangsamen — im Folgenden betrachten wir einige Alternativen.
Die Nutzung von time.sleep() ist einfach und selbst für Einsteiger leicht zu erlernen. Dennoch gibt es einige Feinheiten, die sich auf Performance und Debugging auswirken können.
Zuerst muss das Modul time importiert werden:
import time
time.sleep(5)
In diesem Beispiel pausiert das Programm für 5 Sekunden. Der übergebene Wert kann eine ganze Zahl oder ein Gleitkommawert sein — so lassen sich auch Bruchteile von Sekunden realisieren.
Syntax:
time.sleep(seconds)
Die Funktion gibt keinen Rückgabewert zurück. Das bedeutet, man kann nicht genau messen, wie präzise die Pause war — der Thread wird einfach für die angegebene Zeit angehalten.
Ein kurzes Beispiel mit Nachrichten, die im Abstand von 2 Sekunden ausgegeben werden:
import time
print("First message")
time.sleep(2)
print("Second message")
time.sleep(2)
print("Third message")
Beim Ausführen dieses Skripts sieht der Benutzer zwischen jeder Nachricht eine Pause von 2 Sekunden — genau so funktioniert eine Verzögerung mit time.sleep(2).
Die Funktion akzeptiert nur einen Parameter, der jedoch entweder ein Integer oder ein Float sein kann. Das bietet Flexibilität bei der Implementierung von Wartezeiten.
In den meisten Fällen wird eine ganze Zahl übergeben:
time.sleep(10)
Das Skript pausiert für 10 Sekunden — ideal für längere Pausen oder zeitgesteuerte API-Anfragen.
Manchmal reicht eine kurze Pause von wenigen Millisekunden. Das geht mit einem Gleitkommawert:
time.sleep(0.5)
Dies erzeugt eine Pause von einer halben Sekunde. Beachte jedoch, dass durch Betriebssystem- und Python-Timer-Limits die tatsächliche Dauer leicht höher sein kann. Für Echtzeitsysteme mit hoher Präzision sollten spezialisierte Timer verwendet werden.
Obwohl time.sleep() am beliebtesten und am einfachsten ist, gibt es alternative Ansätze, die bei externen Ereignissen oder mehreren Threads besser geeignet sind.
Die einfachste Art, das Programm anzuhalten, ist input(). Es stoppt die Ausführung, bis der Benutzer Enter drückt oder eine Eingabe macht.
print("Press Enter to continue...")
input()
print("Resuming program execution")
Technisch gesehen ist das keine zeitgesteuerte Pause, sondern ein Eingabe-Warten. Diese Methode ist selten in automatisierten Skripten nützlich, kann aber in Debugging- oder Konsolenprogrammen hilfreich sein.
In mehrthreadigen Programmen kann ein Synchronisationsobjekt wie threading.Event() eingesetzt werden, um Threads zu blockieren, bis ein Signal empfangen wird.
import threading
event = threading.Event()
def worker():
print("Starting work in thread")
event.wait()
print("Event received, resuming work")
thread = threading.Thread(target=worker)
thread.start()
import time
time.sleep(3)
event.set()
Hier bleibt der Thread blockiert, bis event.set() aufgerufen wird. Das ermöglicht flexible Kontrolle, da der Thread sofort fortgesetzt werden kann, ohne die volle Zeit abzuwarten.
In asynchronem Python-Code (Modul asyncio) wird asyncio.sleep() verwendet. Im Gegensatz zu time.sleep() blockiert es nicht den gesamten Thread, sondern nur die aktuelle Coroutine, während andere Tasks weiterlaufen.
import asyncio
async def main():
print("Start async work")
await asyncio.sleep(2)
print("2 seconds passed, resuming")
asyncio.run(main())
Das ist besonders nützlich, wenn mehrere asynchrone Funktionen parallel laufen sollen. Würde man time.sleep() in diesem Kontext verwenden, würde es die gesamte Event Loop blockieren.
Obwohl time.sleep() einfach ist, kann unsachgemäßer Gebrauch zu unerwarteten Blockaden führen. Deshalb sollte man genau verstehen, wie sie den Programmablauf beeinflusst.
time.sleep() blockiert den Thread, in dem sie aufgerufen wird. fWenn sie im Hauptthread einer GUI-Anwendung (z. B. Tkinter oder PyQt) verwendet wird, friert die Oberfläche ein.
💡 Tipp:
Verwende time.sleep() nur in Neben-Threads, oder nutze asyncio.sleep() für nicht-blockierende Verzögerungen. In grafischen Anwendungen sind Timer (z. B. QTimer, after()) besser geeignet.
In mehrthreadigem Code kann time.sleep() unabhängig in jedem Thread aufgerufen werden, aber beachte: Sie gibt den Global Interpreter Lock (GIL) nicht automatisch frei.
Ob andere Threads laufen können, hängt vom Thread-Scheduler des Betriebssystems ab.
In asynchronem Code sollte time.sleep() nicht innerhalb der Event Loop verwendet werden, da sie diese blockiert. Verwende stattdessen asyncio.sleep(), das den Scheduler weiterarbeiten lässt.
Angenommen, du schreibst ein Skript, das eine API regelmäßig abfragt — aber laut API-Regeln nicht öfter als alle 30 Sekunden. Eine einfache Lösung mit time.sleep():
import time
def poll_api():
print("Making API request...")
def main():
while True:
poll_api()
time.sleep(30)
if __name__ == "__main__":
main()
Nach jeder Anfrage pausiert das Skript 30 Sekunden. So werden Rate-Limits eingehalten.
Asynchrone Variante:
import asyncio
async def poll_api():
print("Making API request...")
async def main():
while True:
await poll_api()
await asyncio.sleep(30)
if __name__ == "__main__":
asyncio.run(main())
Diese Version blockiert das Programm nicht komplett — andere Tasks können parallel laufen. Das ist skalierbarer und effizienter.
Das Organisieren von Pausen und Verzögerungen ist ein wichtiger Bestandteil der Python-Entwicklung. time.sleep() ist dabei das naheliegendste Werkzeug, doch die Wahl zwischen time.sleep(), asyncio.sleep() und anderen Methoden hängt von der Programmarchitektur ab.
Verwende time.sleep() für kurze Verzögerungen, Tests oder Demo-Ausgaben.
Vermeide Blockierungen im Hauptthread von GUI-Anwendungen.
In asynchronem Code: nutze asyncio.sleep() statt time.sleep().
In mehrthreadigen Programmen: beachte, dass nur der aktuelle Thread pausiert.