Umgang mit Signalen in Python-Threads

8

Ich habe eine in Python geschriebene Anwendung, und wann auch immer ein Interrupt über Strg + C oder manchmal mit kill empfangen wird, die Anwendung wird hängen. Ein Stack-Trace wird von einem Thread dargestellt, aber die Anwendung bleibt im Vordergrund, und ich muss sie normalerweise mit Strg + Z dann im Hintergrund erstellen versuche es zu töten.

Was ist der richtige Weg, Signale und Tastaturinterrupts in einer Anwendung mit Gewinde zu behandeln?

    
Eric Pruitt 06.01.2011, 15:10
quelle

4 Antworten

13

Wenn Sie newthread.daemon = True vor dem Start jedes Threads setzen, werden die Threads automatisch beendet, wenn der Hauptthread beendet wird. Das ist nicht genau das, was du gefragt hast, aber von dem, was du beschrieben hast, klingt es, als könnte es wissenswert sein.

    
Thomas K 06.01.2011, 15:43
quelle
5
___ answer4616691 ___

Wenn Sie SIGINT vor dem Start jedes Threads setzen, werden die Threads automatisch beendet, wenn der Hauptthread beendet wird. Das ist nicht genau das, was du gefragt hast, aber von dem, was du beschrieben hast, klingt es, als könnte es wissenswert sein.

    
___ qstnhdr ___ Umgang mit Signalen in Python-Threads ___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ answer4616976 ___

CPython-Threading: Unterbrechen deckt ab, was mit Signalen in Python-Threads und verschiedenen geschieht Lösungen für Ihr Problem. Es ist eine gute Lektüre.

    
___ answer4616667 ___

Verwenden Sie das Signalmodul und lesen Sie weiter hier Signalhandler und Einloggen in Python über mögliche Fallstricke.

Um Thread Aktionen vom Benutzer abzufangen, müssen Sie einen Signal Handler für% co_de erstellen %.

Innerhalb des Signalhandlers notify (Nachrichtenwarteschlangen oder synchronisierter RLock-Attributzugriff) müssen Ihre Threads heruntergefahren werden oder was auch immer Sie vorhaben.

    
___ tag123signals ___ Ein Signal ist eine Benachrichtigung an einen Prozess, bei dem ein Ereignis aufgetreten ist. Signale werden manchmal als Software-Interrupts bezeichnet. Signale sind analog zu Hardware-Interrupts insofern, als sie den normalen Ablauf der Ausführung eines Programms unterbrechen; In den meisten Fällen ist es nicht möglich, genau vorherzusagen, wann ein Signal ankommt. Sie sind in den C-Standards definiert und in POSIX erweitert, aber viele andere Programmiersprachen / -systeme bieten auch Zugriff darauf. ___ tag123interrupt ___ Bei der Berechnung ist ein Interrupt ein asynchrones Signal, das die Notwendigkeit von Aufmerksamkeit oder ein synchrones Ereignis in der Software anzeigt, das die Notwendigkeit einer Änderung der Ausführung anzeigt. ___ tag123multithreading ___ Multi-Threading ist die Fähigkeit eines Computers oder eines Programms, Arbeit gleichzeitig oder asynchron auszuführen, indem mehrere gleichzeitige Ausführungsströme (im Allgemeinen als Threads bezeichnet) verwendet werden. ___ qstntxt ___

Ich habe eine in Python geschriebene Anwendung, und wann auch immer ein Interrupt über Strg + C oder manchmal mit kill empfangen wird, die Anwendung wird hängen. Ein Stack-Trace wird von einem Thread dargestellt, aber die Anwendung bleibt im Vordergrund, und ich muss sie normalerweise mit Strg + Z dann im Hintergrund erstellen versuche es zu töten.

Was ist der richtige Weg, Signale und Tastaturinterrupts in einer Anwendung mit Gewinde zu behandeln?

    
___
unholysampler 06.01.2011 15:30
quelle
5

CPython-Threading: Unterbrechen deckt ab, was mit Signalen in Python-Threads und verschiedenen geschieht Lösungen für Ihr Problem. Es ist eine gute Lektüre.

    
brildum 06.01.2011 16:10
quelle
1

Verwenden Sie das Signalmodul und lesen Sie weiter hier Signalhandler und Einloggen in Python über mögliche Fallstricke.

Um Ctrl+C Aktionen vom Benutzer abzufangen, müssen Sie einen Signal Handler für% co_de erstellen %.

Innerhalb des Signalhandlers notify (Nachrichtenwarteschlangen oder synchronisierter RLock-Attributzugriff) müssen Ihre Threads heruntergefahren werden oder was auch immer Sie vorhaben.

    
Raphael Bossek 06.01.2011 15:41
quelle