Maison > développement back-end > Tutoriel Python > Comment puis-je définir un délai d'expiration pour une fonction en Python afin d'éviter les blocages ?

Comment puis-je définir un délai d'expiration pour une fonction en Python afin d'éviter les blocages ?

Linda Hamilton
Libérer: 2024-12-04 17:24:15
original
613 Les gens l'ont consulté

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

Expiration d'une fonction avec une date limite

Dans les scripts shell, il est courant de rencontrer des cas où certaines tâches, telles que la capture d'écran de sites Web, peuvent devenir cela prend beaucoup de temps de manière inattendue, voire échoue. Pour résoudre ce problème, nous pouvons implémenter un mécanisme de délai d'attente pour mettre fin à une fonction si elle dépasse un délai prédéterminé.

Une approche pour implémenter un délai d'attente consiste à utiliser le module de signal de Python. Ce module nous permet de définir une minuterie et de déclencher une exception lorsque le délai expire. Cependant, il est important de noter que cette solution n'est applicable que dans les environnements UNIX.

Pour implémenter la fonctionnalité de timeout, nous pouvons créer un décorateur appelé @timeout en utilisant le code fourni dans la réponse. Ce décorateur peut être appliqué à n’importe quelle fonction de longue durée pour imposer une limite de temps. Voici une version modifiée du code pour plus de clarté :

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

Voici comment utiliser le décorateur @timeout dans votre 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)
Copier après la connexion

En appliquant le décorateur @timeout à my_long_running_function, il a désormais un délai de 10 secondes. Si la fonction dépasse ce délai, elle déclenchera une exception TimeoutError, qui pourra être gérée dans votre fonction principale. Ce mécanisme garantit que votre script ne reste pas bloqué indéfiniment en raison de tâches lentes ou qui ne répondent pas.

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