Erstens müssen Sie beim Einrichten von Signalhandlern mit dem signal
-Modul diese im Hauptfenster erstellen Faden. Sie erhalten eine Ausnahme, wenn Sie versuchen, sie in einem separaten Thread zu erstellen.
Signalhandler, die über die Funktion signal.signal()
registriert sind, werden immer im Hauptthread aufgerufen. Auf Architekturen, die das Senden von Signalen an Threads unterstützen, glaube ich, dass auf der C-Ebene die Python-Laufzeit alle Signale auf Threads ignoriert und einen Signalhandler auf dem Hauptthread hat, mit dem sie zu Ihrem Python-Code-Signalhandler geschickt wird.
Die Dokumentation für das Modul thread
besagt, dass die Ausnahme KeyboardInterrupt
(welche wird normalerweise von SIGINT
ausgelöst) kann an einen beliebigen Thread gesendet werden , außer wenn Sie das signal
-Modul verfügbar haben zu dir, die alle Unix-Systeme haben sollten. In diesem Fall wird es an den Hauptthread geliefert. Wenn Sie sich auf einem System ohne signal
befinden, müssen Sie KeyboardInterrupt
in Ihrem Thread abfangen und thread.interrupt_main()
, um es im Hauptthread erneut zu erstellen.
Weitere Informationen finden Sie in den Python-Dokumenten für die thread
und signal
Module.
Aus der signal
Dokumentation:
Es muss sorgfältig darauf geachtet werden, dass sowohl Signale als auch Threads im selben Programm verwendet werden. Bei der Verwendung von Signalen und Threads ist Folgendes grundsätzlich zu beachten: Führen Sie im Hauptthread der Ausführung immer
signal()
-Operationen aus. Jeder Thread kann einalarm()
,getsignal()
,pause()
,setitimer()
odergetitimer()
; Nur der Haupt-Thread kann einen neuen Signal-Handler setzen, und der Haupt-Thread ist der einzige, der Signale empfängt (dies wird vom Python-Signalmodul erzwungen, selbst wenn die zugrunde liegende Thread-Implementierung das Senden von Signalen an einzelne Threads unterstützt). Dies bedeutet, dass Signale nicht als Mittel zur Kommunikation zwischen den Threads verwendet werden können. Verwenden Sie stattdessen Sperren.
Tags und Links python multithreading signals posix unix