Maison >développement back-end >Tutoriel Python >Comment gérer gracieusement les signaux SIGTERM en Python ?
Gérer gracieusement les signaux SIGTERM en Python
Lorsque vous travaillez avec des démons Python de longue durée, la gestion gracieuse des signaux de terminaison tels que SIGTERM est cruciale pour garantir un arrêt propre sans perte de données. Cela implique la possibilité de suspendre l'exécution en cours, d'effectuer les tâches de nettoyage nécessaires, puis de terminer le processus en douceur. Voici comment y parvenir :
Utilisation d'un gestionnaire de signal
Python fournit la fonction signal.signal pour enregistrer un gestionnaire pour un signal spécifique. En enregistrant un gestionnaire pour SIGTERM, nous pouvons intercepter le signal avant qu'il ne termine l'exécution. Cependant, comme mentionné dans la question, le gestionnaire interrompt toujours l'exécution en cours et se passe le contrôle.
Utiliser un thread séparé pour la gestion du signal
Pour éviter d'interrompre l'exécution exécution actuelle, nous pouvons créer un thread séparé pour gérer l'événement de signal. Cela nous permet d'effectuer des tâches liées à l'arrêt en arrière-plan sans perturber la boucle principale. Voici un exemple utilisant une classe simple :
Solution :
import signal import threading import time class GracefulKiller: kill_now = False def __init__(self): signal.signal(signal.SIGINT, self.exit_gracefully) signal.signal(signal.SIGTERM, self.exit_gracefully) def exit_gracefully(self, signum, frame): self.kill_now = True def mainloop(): killer = GracefulKiller() while not killer.kill_now: # Perform necessary tasks in the main loop time.sleep(1) print("doing something in a loop ...") if __name__ == '__main__': mainloop() # When the main loop exits, we have gracefully handled the termination signal print("End of the program. I was killed gracefully :)")
Dans cette solution, la classe GracefulKiller enregistre un gestionnaire de signal pour SIGTERM. Lorsque le signal est reçu, l'indicateur kill_now est défini sur True. La boucle principale vérifie cet indicateur et continue jusqu'à ce qu'il soit vrai. Cela permet à la boucle principale d'accomplir toutes les tâches critiques avant de se terminer correctement.
En utilisant un thread séparé ou une solution basée sur les classes, nous pouvons garantir que le signal de terminaison est traité sans interrompre prématurément l'exécution principale. Cette approche nous permet d'effectuer un arrêt progressif, garantissant l'intégrité des données et une sortie propre de notre démon.
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!