Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich eine Zeitüberschreitung für eine Funktion in Python festlegen, um Deadlocks zu verhindern?

Wie kann ich eine Zeitüberschreitung für eine Funktion in Python festlegen, um Deadlocks zu verhindern?

Linda Hamilton
Freigeben: 2024-12-04 17:24:15
Original
613 Leute haben es durchsucht

How Can I Set a Timeout for a Function in Python to Prevent Deadlocks?

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage