Maison >développement back-end >Tutoriel Python >Comment puis-je annuler les fonctions Python de longue durée à l'aide de délais d'attente ?
Annulation des appels de fonction de longue durée avec 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 lever une exception.
Pour assurer une bonne gestion du scénario de timeout, il est essentiel d'annuler le timer 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.
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!