Heim >Backend-Entwicklung >Python-Tutorial >Wie implementiert man eine Timeout-Funktion in Shell-Scripting mit einer vordefinierten Dauer?
Timeout-Funktion mit vordefinierter Dauer
Beim Shell-Scripting ist es nützlich, über einen Mechanismus zum Beenden lang laufender Aufgaben zu verfügen, um übermäßiges Warten zu vermeiden . Die Herausforderung besteht hier darin, eine Funktion in ein Timeout-Skript zu packen und False zurückzugeben, wenn sie ein bestimmtes Zeitlimit überschreitet.
Ein Ansatz besteht darin, einen asynchronen Timer festzulegen, der nach einem vordefinierten Intervall eine False-Antwort auslöst. Glücklicherweise ist eine solche Lösung mithilfe von Signalhandlern in der Bibliothek signal (verfügbar auf UNIX-basierten Systemen) erreichbar.
Der Prozess umfasst die Erstellung eines benutzerdefinierten Dekorators (@timeout), der das Signal nutzt. alarm(), um einen Alarm für das gewünschte Zeitintervall einzustellen. Innerhalb der dekorierten Funktion wird bei Ablauf des Alarms eine TimeoutError-Ausnahme ausgelöst, die den Vorgang effektiv unterbricht.
Um diese Lösung in Ihren Code zu integrieren, speichern Sie den folgenden Code als timeout.py und importieren Sie es:
import errno import os import signal import functools class TimeoutError(Exception): pass def timeout(seconds=10, error_message=os.strerror(errno.ETIME)): def decorator(func): def _handle_timeout(signum, frame): raise TimeoutError(error_message) @functools.wraps(func) def wrapper(*args, **kwargs): signal.signal(signal.SIGALRM, _handle_timeout) signal.alarm(seconds) try: result = func(*args, **kwargs) finally: signal.alarm(0) return result return wrapper return decorator
Kommentieren Sie nun in Ihrem Anwendungscode jede potenziell lang laufende Funktion mit dem @timeout-Dekorator. Zum Beispiel:
from timeout import timeout # Short timeout @timeout(5) def slow_function(): # ... # Default timeout @timeout def another_slow_function(): # ... # Customize timeout and error message @timeout(30, error_message="Task timed out") def yet_another_slow_function(): # ...
Dieser Ansatz stellt sicher, dass eine Funktion, wenn sie länger als das angegebene Timeout-Intervall dauert, einen TimeoutError auslöst und False zurückgibt, sodass Sie unerwartete Verzögerungen elegant bewältigen können.
Das obige ist der detaillierte Inhalt vonWie implementiert man eine Timeout-Funktion in Shell-Scripting mit einer vordefinierten Dauer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!