Was ist der Python-Thread + Unix signalisiert Semantik?

8

Welche Regeln gelten für Python-Threads und wie werden Unix-Signale behandelt?

Ist KeyboardInterrupt , was von SIGINT ausgelöst wird, aber intern von der Python-Laufzeit behandelt wird, anders gehandhabt?

    
Joe Shaw 27.07.2009, 16:08
quelle

2 Antworten

9

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.

    
Joe Shaw 27.07.2009, 16:21
quelle
4

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 ein alarm() , getsignal() , pause() , setitimer() oder getitimer() ; 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.

    
Bastien Léonard 27.07.2009 16:11
quelle