Maison >développement back-end >Tutoriel Python >Comment puis-je empêcher l'arrêt indéfini des fonctions Python avec un délai d'attente ?

Comment puis-je empêcher l'arrêt indéfini des fonctions Python avec un délai d'attente ?

DDD
DDDoriginal
2024-12-24 00:55:09959parcourir

How Can I Prevent Indefinitely Halting Python Functions with a Timeout?

Délai d'expiration des appels de fonction

Lors de l'appel d'une fonction en Python pouvant interrompre indéfiniment l'exécution du script, il devient nécessaire d'établir un mécanisme pour l'empêcher. La solution réside dans la définition d'un seuil de délai d'attente après lequel le script interviendra et mettra fin à la fonction.

Utilisation du package Signal

Pour les systèmes basés sur UNIX, le package signal offre une solution robuste. Pour l'utiliser :

  1. Importez le package de signaux : import signal
  2. Définissez une fonction de gestionnaire à invoquer en cas d'expiration du délai. Cette fonction doit déclencher une exception pour terminer le processus.
  3. Utilisez la fonction signal.alarm() pour spécifier la durée du délai d'attente.
  4. Définissez le gestionnaire de signal SIGALRM à l'aide de signal.signal(signal.SIGALRM , gestionnaire).
  5. Appelez la fonction potentiellement bloquée dans un bloc try. En cas d'expiration du délai d'attente, l'exception du gestionnaire sera déclenchée.
  6. Si vous le souhaitez, annulez le minuteur à l'aide de signal.alarm(0) une fois la fonction terminée dans le temps imparti.

Voici un exemple illustratif :

import signal

# Handler function
def handler(signum, frame):
    print("Timeout reached!")
    raise Exception("Timeout exception")

# Function that may stall indefinitely
def loop_forever():
    while True:
        print("Looping")
        # Pause execution for 1 second
        time.sleep(1)

# Set timeout to 5 seconds
signal.alarm(5)
signal.signal(signal.SIGALRM, handler)

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

Si la fonction loop_forever() ne parvient pas à se terminer dans les 5 secondes, la fonction de gestionnaire le fera être invoqué, déclenchant l'exception de délai d'attente et mettant fin au processus.

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