Ich teste Python-Threading mit dem folgenden Skript:
import threading
class FirstThread (threading.Thread):
def run (self):
while True:
print 'first'
class SecondThread (threading.Thread):
def run (self):
while True:
print 'second'
FirstThread().start()
SecondThread().start()
Dies läuft in Python 2.7 unter Kubuntu 11.10. Ctrl+ Cwird es nicht töten. Ich habe auch versucht, einen Handler für Systemsignale hinzuzufügen, aber das hat nicht geholfen:
import signal
import sys
def signal_handler(signal, frame):
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
Um den Prozess zu beenden, beende ich ihn durch PID, nachdem ich das Programm mit Ctrl+ in den Hintergrund geschickt habe Z, was nicht ignoriert wird. Warum wird Ctrl+ Cso beharrlich ignoriert? Wie kann ich das beheben?
Antworten:
Ctrl+ Cbeendet den Hauptthread, aber da sich Ihre Threads nicht im Dämonmodus befinden, werden sie weiter ausgeführt, und das hält den Prozess am Leben. Wir können sie zu Dämonen machen:
Aber dann gibt es noch ein anderes Problem: Sobald der Haupt-Thread Ihre Threads gestartet hat, gibt es nichts mehr zu tun. Es wird also beendet und die Threads werden sofort zerstört. Lassen Sie uns also den Haupt-Thread am Leben erhalten:
Jetzt wird der Druck "zuerst" und "zweitens" fortgesetzt, bis Sie Ctrl+ drücken C.
Bearbeiten: Wie Kommentatoren hervorgehoben haben, haben die Daemon-Threads möglicherweise keine Chance, Dinge wie temporäre Dateien zu bereinigen. Wenn Sie das brauchen, fangen Sie das
KeyboardInterrupt
am Hauptgewinde und lassen Sie es das Bereinigen und Herunterfahren koordinieren. Aber in vielen Fällen ist es wahrscheinlich gut genug, Daemon-Threads plötzlich sterben zu lassen.quelle
tempfile.TemporaryFile()
können beispielsweise auf der Festplatte verbleiben .daemon=True
anThread.__init__
KeyboardInterrupt und Signale werden nur vom Prozess gesehen (dh vom Hauptthread) ... Schauen Sie sich Strg-C an, dh KeyboardInterrupt, um Threads in Python zu beenden
quelle
Ich denke, es ist am besten, join () für Ihre Threads aufzurufen, wenn Sie erwarten, dass sie sterben. Ich habe mir mit Ihrem Code etwas Freiheit genommen, um die Schleifen zu beenden (Sie können dort auch alle erforderlichen Bereinigungsanforderungen hinzufügen). Der variable Würfel wird bei jedem Durchgang auf Wahrheit überprüft, und wenn er wahr ist, wird das Programm beendet.
quelle
while True
ist albern, sollten Siejoin
direkt - und diese Überschreibungsfunktion ist irgendwie fraglich. Vielleicht ,def join(self, force=False): if force: self.die = True
so dassjoin()
unverändert vonjoin(force=True)
kills sie. Aber selbst dann ist es besser, beide Threads zu informieren, bevor Sie sich einem anschließen.Eine verbesserte Version der Antwort von @Thomas K:
is_any_thread_alive()
nach diesem Kern , die diemain()
automatisch beenden kann .Beispielcodes:
quelle