Heim >Backend-Entwicklung >Python-Tutorial >Wie implementiert man eine Timeout-Funktion, um lang laufende Prozesse zu verhindern?

Wie implementiert man eine Timeout-Funktion, um lang laufende Prozesse zu verhindern?

Barbara Streisand
Barbara StreisandOriginal
2024-11-30 08:55:15899Durchsuche

How to Implement a Timeout Function to Prevent Long-Running Processes?

Timeout-Funktion, wenn der Abschluss zu lange dauert

Um eine Situation zu vermeiden, in der der Abschluss einer bestimmten Funktion zu lange dauert, a Timeout-Mechanismus kann implementiert werden. Dabei wird mithilfe von Signalhandlern ein Alarm gesetzt, der nach einer vorgegebenen Zeitspanne eine Ausnahme auslöst. Diese Methode ist besonders nützlich für UNIX-Umgebungen.

So nutzen Sie diesen Mechanismus:

  1. Erstellen Sie einen Decorator:
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
  1. Wenden Sie das an Dekorator:
from timeout import timeout

# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function():
    ...

# Timeout after 5 seconds
@timeout(5)
def another_long_running_function():
    ...

Dadurch wird sichergestellt, dass jede mit @timeout dekorierte Funktion unterbrochen wird, wenn sie den angegebenen Timeout-Zeitraum überschreitet.

Das obige ist der detaillierte Inhalt vonWie implementiert man eine Timeout-Funktion, um lang laufende Prozesse zu verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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