Maison >développement back-end >Tutoriel Python >Comment implémenter une fonction de délai d'attente pour empêcher les processus de longue durée ?

Comment implémenter une fonction de délai d'attente pour empêcher les processus de longue durée ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-30 08:55:15896parcourir

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

Fonction de délai d'attente si la fin prend trop de temps

Afin d'éviter une situation où une fonction spécifique prend trop de temps à se terminer, un Un mécanisme de délai d'attente peut être implémenté. Cela implique de définir une alarme à l'aide de gestionnaires de signaux qui déclencheront une exception après une période de temps prédéterminée. Cette méthode est particulièrement utile pour les environnements UNIX.

Voici comment utiliser ce mécanisme :

  1. Créer un décorateur :
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. Appliquer le Décorateur :
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():
    ...

Cela garantit que toute fonction décorée avec @timeout sera interrompue si elle dépasse le délai d'attente spécifié.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn