Heim >Backend-Entwicklung >Python-Tutorial >Wie verarbeitet man SIGTERM-Signale in Python-Daemons ordnungsgemäß?

Wie verarbeitet man SIGTERM-Signale in Python-Daemons ordnungsgemäß?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-15 15:56:03503Durchsuche

How to Gracefully Handle SIGTERM Signals in Python Daemons?

Anmutige Handhabung des SIGTERM-Signals

Bei dämonischen Vorgängen kann das Beenden eines Prozesses mithilfe des SIGTERM-Signals (TERM) kritische Aufgaben abrupt unterbrechen. Um dieses Problem anzugehen, wollen wir untersuchen, wie man dieses Signal elegant handhaben kann.

Problemstellung

Gegeben sei ein einfacher Daemon, der in Python geschrieben wurde:

def mainloop():
    while True:
        # Perform important jobs
        # Sleep

Dämonisierung mit Start-Stopp -daemon sendet bei Beendigung SIGTERM (TERM). Wenn das Signal während eines kritischen Vorgangs empfangen wird (z. B. Schritt #2), wird es sofort beendet.

Mit signal.signal()

Versuche, das Signalereignis mit signal.signal( zu verarbeiten signal.SIGTERM, Handler) kann auch die aktuelle Ausführung unterbrechen und die Kontrolle an den Handler umleiten.

Lösung: Separater Thread für Signal Handhabung

Um eine Unterbrechung der aktuellen Ausführung zu vermeiden, können wir einen separaten Thread erstellen, um das TERM-Signal zu verarbeiten. Dieser Thread kann „shutdown_flag = True“ setzen, wodurch die Hauptschleife ordnungsgemäß beendet werden kann.

Implementierung

Hier ist eine klassenbasierte Lösung für eine ordnungsgemäße Signalverarbeitung:

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("doing something in a loop ...")
   
  print("End of the program. I was killed gracefully :)")

Vorteile

Diese Lösung ermöglicht es dem Daemon, SIGTERM ordnungsgemäß zu verarbeiten und sicherzustellen, dass kritische Vorgänge vor der Beendigung abgeschlossen werden können. Es bietet außerdem eine saubere und wartbare Implementierung für die Verarbeitung von Signalen in Multithread-Umgebungen.

Das obige ist der detaillierte Inhalt vonWie verarbeitet man SIGTERM-Signale in Python-Daemons ordnungsgemäß?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn