"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je annuler les fonctions Python de longue durée à l'aide de délais d'attente ?

Comment puis-je annuler les fonctions Python de longue durée à l'aide de délais d'attente ?

Publié le 2024-12-23
Parcourir:344

How Can I Cancel Long-Running Python Functions Using Timeouts?

Annulation des appels de fonction de longue durée avec des délais d'attente

Lors de l'exécution de scripts complexes incluant des fonctions potentiellement bloquées, il est souhaitable de fournir un moyen de mettre fin à ces fonctions si elles dépassent un temps d'exécution spécifié. Cela garantit que le script ne répondra pas ou ne restera pas bloqué indéfiniment.

En Python, l'exploitation du package de signaux (disponible sur les systèmes UNIX) offre une solution à ce problème. En enregistrant un gestionnaire de signal, vous pouvez définir un délai d'attente pour un appel de fonction. Si la fonction prend plus de temps que le temps spécifié, le gestionnaire est invoqué, vous permettant de gérer la situation de manière appropriée.

Considérez l'extrait de code suivant :

import signal

# Register a signal handler for the timeout
def handler(signum, frame):
    print("Forever is over!")
    raise Exception("end of time")

# Define a function that may run for an indetermined time
def loop_forever():
    import time
    while 1:
        print("sec")
        time.sleep(1)

# Register the signal function handler
signal.signal(signal.SIGALRM, handler)

# Define a timeout for the function
signal.alarm(10)

try:
    loop_forever()
except Exception as exc:
    print(exc)

# Cancel the timer if the function returned before timeout
signal.alarm(0)

Dans cet exemple, nous enregistrons la fonction de gestionnaire pour gérer le signal de délai d'attente. Nous définissons ensuite notre fonction loop_forever de longue durée, qui imprime en continu le message "sec" chaque seconde.

Après avoir défini un délai d'attente de 10 secondes à l'aide de signal.alarm(10), nous essayons d'exécuter loop_forever. Si l'exécution de la fonction prend plus de 10 secondes, notre gestionnaire de signal est invoqué et affiche "Forever is over!" et déclencher une exception.

Pour garantir une bonne gestion du scénario d'expiration, il est essentiel d'annuler le minuteur si la fonction revient avant l'heure spécifiée. Dans notre exemple, nous appelons signal.alarm(0) pour annuler le minuteur lorsqu'une exception est levée.

Notez que le package de signaux peut ne pas interagir correctement avec les environnements multithread. De plus, si une fonction intercepte et ignore les exceptions déclenchées pendant le délai d'attente, le mécanisme de délai d'attente peut ne pas être efficace.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3