Maison >développement back-end >Tutoriel Python >Les processus Python peuvent-ils gérer SIGTERM avec élégance sans interruption ?

Les processus Python peuvent-ils gérer SIGTERM avec élégance sans interruption ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-10 19:23:02672parcourir

Can Python Processes Handle SIGTERM Gracefully Without Interruption?

Gestion de SIGTERM pour un arrêt progressif

Dans le contexte des applications du monde réel, il est essentiel de s'assurer que les processus peuvent gérer les signaux de terminaison avec élégance pour éviter des interruptions brusques. En Python, la gestion de SIGTERM (TERM) est une exigence courante lors de la gestion des processus démons.

Considérez l'exemple de processus démon suivant :

def mainloop():
    while True:
        # Important operations
        # ...
        # Sleep

Problème :

Lorsque le processus Daemon reçoit un signal SIGTERM par défaut, le flux d'exécution est immédiatement interrompu, entraînant la fin du processus sans terminer les opérations en cours.

Question :

Est-il possible de gérer SIGTERM avec élégance sans interrompre le flux d'exécution actuel ? L'objectif est de permettre au processus de terminer l'opération en cours, puis de se terminer correctement en définissant un indicateur d'arrêt dans un thread séparé.

Solution :

Utilisation une classe Graceful Killer :

Nous pouvons exploiter une simple classe GracefulKiller pour gérer SIGTERM avec élégance :

import signal
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

if __name__ == '__main__':
    killer = GracefulKiller()
    while not killer.kill_now:
        time.sleep(1)
        print("Performing operation...")

    print("Process exited gracefully.")

Dans cette solution :

  1. The GracefulKiller La classe configure des gestionnaires de signaux pour SIGINT (Ctrl C) et SIGTERM (envoyés par défaut par start-stop-daemon).
  2. La méthode exit_gracefully est exécutée lorsque l'un ou l'autre signal est reçu. Il définit le drapeau kill_now sur True.
  3. La boucle principale vérifie en permanence le drapeau kill_now. Si c'est vrai, cela signifie qu'un signal a été reçu et que le processus se termine normalement.
  4. Cette approche permet à la boucle principale de terminer son opération en cours avant la fin du processus, évitant ainsi une interruption brusque.

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