Heim  >  Artikel  >  Backend-Entwicklung  >  So erfassen Sie das Strg+C-Beendigungssignal in Python3

So erfassen Sie das Strg+C-Beendigungssignal in Python3

WBOY
WBOYnach vorne
2023-05-21 13:46:321857Durchsuche

Technischer Hintergrund

Lang laufende Python-Programme, wie das Backend eines Servers oder wissenschaftliche Rechenprogramme, erfordern besondere Aufmerksamkeit. Wenn wir bestimmte Vorgänge ausführen, z. B. die Tastenkombination Strg+C verwenden, um ein laufendes Programm zu beenden, müssen wir es möglicherweise vorzeitig beenden. Normalerweise gibt es für diese Situation zwei Möglichkeiten: Zum einen liegt im Programm ein Fehler vor und das Programm muss zur Anpassung gestoppt werden. Das andere ist, dass das Programm selbst korrekt ist, aber zu langsam läuft oder möglicherweise vorzeitig beendet werden soll. In diesem Szenario hoffen wir oft, die entsprechenden Berechnungsergebnisse beizubehalten. Wenn wir jedoch ein Datenspeicherformat eines Drittanbieters zum Speichern von Daten verwenden, unterstützt dieses möglicherweise keine kontinuierliche Speicherung. Es ist sehr üblich, die Ergebnisse nach Abschluss der Programmausführung zu speichern. Wenn das Programm mittendrin beendet wird, sind spezielle Mittel erforderlich, um die Ergebnisse zu speichern.

Grundlegender Fall

Schauen wir uns zunächst einen relativ einfachen Fall an: ein gewöhnliches Programm, das jede Sekunde eine Zahl ausgibt Erfassen Sie dieses Abschlusssignal.

# signal_exit.py
import signal
import sys
 
def signal_handler(signal, frame):
    print ('\nSignal Catched! You have just type Ctrl+C!')
    sys.exit(0)
 
if __name__ == '__main__':
    import time
 
    signal.signal(signal.SIGINT, signal_handler)
    for x in range(100):
        time.sleep(1)
        print (x)

Wenn wir dieses Programm zur Hälfte ausführen und gleichzeitig Strg+C drücken, erhalten wir die folgenden Ergebnisse:

$ python3 signal_exit.py# 🎜🎜#0
1
2
^C
Signal abgefangen! Sie müssen nur Strg+C eingeben!

Das zeigt dieses Ergebnis , Wir haben die externe Operation von Strg+C während der Ausführung des Programms erfasst und die Operation entsprechend verarbeitet, bevor die Ausführung des Programms beendet wurde. Es ist zu beachten, dass das Programm nicht gestoppt wird und weiter ausgeführt wird, wenn die Beendigungsoperation von sys.exit (0) zu diesem Zeitpunkt nicht hinzugefügt wird. Dies entspricht dem Abfangen des abnormalen Beendigungssignals, aber keiner Verarbeitung.

Übergabe externer Parameter an das Beendigungssignal

Im obigen Fall haben wir nur das externe Signal „Beendigung des Betriebs“ erfasst, aber wenn wir weiter gehen, ich Möchten Sie die letzte Ausgabenummer erfassen? Die Funktion signal.signal selbst unterstützt nicht die Übergabe vieler Parameter. Zu diesem Zeitpunkt wird empfohlen, selbst eine Klasse zu erstellen und die Funktion signal_handler als Mitgliedsfunktion der Klasse zu kapseln, damit wir die entsprechenden internen Parameter erhalten können , wie der folgende Fall Wie gezeigt:

# signal_exit.py
import signal
import sys
import time
 
class Printer:
    def __init__(self):
        self.x = 0
        signal.signal(signal.SIGINT, self.signal_handler)
 
    def signal_handler(self, signal, frame):
        print ('\nSignal Catched! You have just type Ctrl+C! The last number is: {}'.format(self.x))
        sys.exit(0)
 
    def run(self, counter=10):
        while self.x < counter:
            print (self.x)
            time.sleep(1)
            self.x += 1
 
if __name__ == &#39;__main__&#39;:
    printer = Printer()
    printer.run(counter=100)

Wenn Sie während der Ausführung des Programms gleichzeitig Strg+C drücken, sieht das Ergebnis wie folgt aus:

# 🎜🎜#$ python3 signal_exit.#0
1

2
^C
Signal abgefangen! Nummer ist: 3#🎜🎜 #

Wie Sie sehen können, haben wir den letzten Ausgabeparameter erfolgreich erfasst.

Das obige ist der detaillierte Inhalt vonSo erfassen Sie das Strg+C-Beendigungssignal in Python3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen