Zeitüberschreitung einer Funktion mit einer Frist
Beim Shell-Scripting kommt es häufig vor, dass bestimmte Aufgaben, wie z. B. das Screengrabbing von Websites, zu Problemen führen können unerwartet zeitaufwändig oder scheitern sogar. Um dies zu beheben, können wir einen Timeout-Mechanismus implementieren, um eine Funktion zu beenden, wenn sie ein vorgegebenes Zeitlimit überschreitet.
Ein Ansatz zur Implementierung eines Timeouts ist die Verwendung des Signalmoduls von Python. Mit diesem Modul können wir einen Timer einstellen und eine Ausnahme auslösen, wenn die Zeit abgelaufen ist. Es ist jedoch wichtig zu beachten, dass diese Lösung nur in UNIX-Umgebungen anwendbar ist.
Um die Timeout-Funktionalität zu implementieren, können wir mithilfe des in der Antwort bereitgestellten Codes einen Dekorator namens @timeout erstellen. Dieser Dekorator kann auf jede Funktion mit langer Laufzeit angewendet werden, um ein Zeitlimit durchzusetzen. Hier ist eine modifizierte Version des Codes zur Verdeutlichung:
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
So verwenden Sie den @timeout-Dekorator in Ihrem Code:
from timeout import timeout @timeout def my_long_running_function(): ... def my_main_function(): try: my_long_running_function() except TimeoutError as e: print(e)
Durch Anwenden des @timeout-Dekorators auf my_long_running_function wird es hat jetzt ein Zeitlimit von 10 Sekunden. Wenn die Funktion diese Frist überschreitet, wird eine TimeoutError-Ausnahme ausgelöst, die in Ihrer Hauptfunktion behandelt werden kann. Dieser Mechanismus stellt sicher, dass Ihr Skript nicht aufgrund langsamer oder nicht reagierender Aufgaben auf unbestimmte Zeit hängen bleibt.
Das obige ist der detaillierte Inhalt vonWie kann ich eine Zeitüberschreitung für eine Funktion in Python festlegen, um Deadlocks zu verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!