Maison >développement back-end >Tutoriel Python >Comment puis-je empêcher les fonctions de script Shell d'expirer lors de l'accès à des ressources distantes ?

Comment puis-je empêcher les fonctions de script Shell d'expirer lors de l'accès à des ressources distantes ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-30 13:02:19264parcourir

How Can I Prevent Shell Script Functions from Timing Out When Accessing Remote Resources?

Fonctions expirées : comment limiter le temps d'exécution

Dans les scripts shell, il peut être avantageux d'empêcher certaines fonctions de s'exécuter sans fin, notamment lorsqu'il s'agit d'accéder à des ressources distantes telles que des URL. En définissant des délais d'attente, vous pouvez vous assurer que les fonctions ne gèlent pas votre script en raison de serveurs lents ou qui ne répondent pas.

Une méthode d'implémentation des délais d'attente consiste à utiliser le décorateur de délai d'attente du module de signal. Ce décorateur, décrit dans la documentation des signaux, utilise des gestionnaires de signaux pour définir une alarme. Une fois l'intervalle de temps spécifié écoulé, une exception est déclenchée, arrêtant effectivement la fonction.

Pour utiliser le décorateur de délai d'attente, importez-le depuis le module timeout.py et spécifiez la durée du délai d'attente (en secondes) comme argument. Vous trouverez ci-dessous un exemple d'extrait qui crée un décorateur avec un délai d'expiration par défaut de 10 secondes et un message d'erreur personnalisé :

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

Pour utiliser le décorateur, appliquez-le simplement à votre fonction de longue durée, comme dans ce qui suit. exemples :

# Default timeout of 10 seconds
@timeout
def long_running_function1():
    ...

# Timeout of 5 seconds
@timeout(5)
def long_running_function2():
    ...

# Timeout of 30 seconds, with custom error message 'Connection timed out'
@timeout(30, os.strerror(errno.ETIMEDOUT))
def long_running_function3():
    ...

N'oubliez pas que cette implémentation n'est applicable que sur les systèmes UNIX. En implémentant des délais d'attente à l'aide du décorateur du module de signal, vous contrôlez désormais la durée d'exécution de vos fonctions et évitez qu'elles ne retardent inutilement votre script shell.

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