Maison >développement back-end >Tutoriel Python >Comment gérer gracieusement les signaux SIGTERM en Python ?

Comment gérer gracieusement les signaux SIGTERM en Python ?

DDD
DDDoriginal
2024-11-15 11:02:02270parcourir

How to Gracefully Handle SIGTERM Signals in 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!

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