Maison > développement back-end > Tutoriel Python > Comment implémenter une fonction de délai d'attente dans les scripts Shell avec une durée prédéfinie ?

Comment implémenter une fonction de délai d'attente dans les scripts Shell avec une durée prédéfinie ?

Barbara Streisand
Libérer: 2024-12-07 11:25:15
original
365 Les gens l'ont consulté

How to Implement a Timeout Function in Shell Scripting with a Predefined Duration?

Fonction de délai d'attente avec une durée prédéfinie

Dans les scripts shell, il est utile d'avoir un mécanisme pour terminer les tâches de longue durée afin d'éviter une attente excessive . Le défi rencontré ici est d'envelopper une fonction dans un script de délai d'attente, renvoyant False si elle dépasse un délai spécifié.

Une approche consiste à définir un minuteur asynchrone qui déclenche une réponse False après un intervalle prédéfini. Heureusement, une telle solution est réalisable à l'aide des gestionnaires de signaux de la bibliothèque signal (disponible sur les systèmes basés sur UNIX).

Le processus implique la création d'un décorateur personnalisé (@timeout) qui exploite le signal. alarm() pour définir une alarme pour l’intervalle de temps souhaité. Dans la fonction décorée, lorsque l'alarme expire, une exception TimeoutError est déclenchée, interrompant effectivement l'opération.

Pour incorporer cette solution dans votre code, enregistrez le code suivant sous timeout.py et importez-le :

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
Copier après la connexion

Maintenant, dans le code de votre application, annotez toute fonction potentiellement longue avec le décorateur @timeout. Par exemple :

from timeout import timeout

# Short timeout
@timeout(5)
def slow_function():
    # ...

# Default timeout
@timeout
def another_slow_function():
    # ...

# Customize timeout and error message
@timeout(30, error_message="Task timed out")
def yet_another_slow_function():
    # ...
Copier après la connexion

Cette approche garantit que si une fonction prend plus de temps que l'intervalle de délai d'attente spécifié, elle déclenchera une TimeoutError et renverra False, vous permettant de gérer les retards inattendus avec élégance.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal