Signalverarbeitung in Python
In meinem Programm habe ich eine Reihe von threads ausgeführt, und ich versuche
zu unterbrechen, der Haupt-thread, um es zu tun, etwas asynchron.
Also ich habe ein hf und senden Sie den Haupt-Prozess ein SIGUSR1 - siehe code
unten:
def SigUSR1Handler(signum, frame):
self._logger.debug('Received SIGUSR1')
return
signal.signal(signal.SIGUSR1, SigUSR1Handler)
[signal.signal(signal.SIGUSR1, signal.SIG_IGN)]
Im obigen Fall alle threads und der main-Prozess beendet - von einem 'c'
Sicht dieses war unerwartet, - ich will die threads weiter, da Sie
vorher waren das signal. Wenn ich die SIG_IGN in stattdessen weiterhin alles
fein.
Kann jemand mir sagen, wie dies zu tun? Vielleicht habe ich etwas zu tun mit "Rahmen"
manuell zurück, wo es war..nur eine Vermutung aber
vielen Dank im Voraus,
Vielen Dank für Ihre Hilfe bei diesem.
Erklären ein bisschen mehr, ich habe die thread-Instanzen zu schreiben-string Informationen zum
ein sockel, der auch die Ausgabe in eine Datei. Diese threads führen Sie Ihre eigene Timer, so dass Sie
unabhängig voneinander schreiben, Ihre Ausgaben an die Steckdose. Wenn das Programm läuft, die ich auch sehen
Ihre Ausgabe auf stdout, sondern es werden alle Register, sobald ich sehe die debug-Zeile aus dem signal.
Brauche ich die threads ständig sende diese info, aber ich brauche das Hauptprogramm
nehmen Sie einen Befehl ein, so fängt es auch etwas anderes zu tun (parallel) für eine Weile.
Ich dachte, ich würde nur in der Lage sein, um ein signal von der Kommandozeile auslösen dieser.
- "alle threads und der main-Prozess beendet" meinst du, dass der Prozess getötet werden? Ist es abstürzt?
- nehmen Sie die oben genannten Schritte in einem mono-thread-Programm und dann
killall -USR1 python
hatte, funktionierte, btw.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mischen Signale und threads immer ein wenig prekär. Was Sie beschreiben, sollte nicht passieren, aber. Python verarbeitet nur Signale im Haupt-thread. Wenn das OS übermittelt das signal an einen anderen thread, dieser thread kurzzeitig unterbrochen (wenn es die Durchführung, sagen wir, ein systemcall), aber es wird nicht führen Sie die signal-handler. Der Haupt-thread wird gebeten, die Ausführung der signalhandler bei der nächsten Gelegenheit.
Was sind deine threads (inklusive dem Haupt-thread) eigentlich tun, wenn Sie ein signal senden? Wie merkst du, dass Sie alle 'stop'? Wird es eine kurze pause (einfach durch die Tatsache erklärt, dass der Haupt-thread benötigen, zu erwerben, die GIL vor dem Umgang mit dem signal) oder dauert der Prozess brechen vollständig?
Werde ich die Art der Antwort auf meine eigene Frage:
In meinem ersten Versuch war ich mit der Zeit.schlafen(run_time) in der main
thread zu kontrollieren, wie lange die threads ran, bis Sie gestoppt wurden. Durch hinzufügen von
debug konnte ich sehen, dass der sleep-Schleife zu sein schien verlassen, sobald die
signal-handler zurückgegeben, so war alles Herunterfahren normalerweise aber früh!
Habe ich ersetzt, den Schlaf mit einer while-Schleife und nicht springen nach
der signal-handler gibt, so meine threads laufen zu halten. So löst es die
problem, aber ich bin noch etwas verwundert über sleep()'s Verhalten.
Sollten Sie wahrscheinlich verwenden Sie ein threading.Condition-Variablen statt Signale zu senden. Haben Sie Ihre Haupt-thread überprüfen Sie jede Schleife und dem ausführen der speziellen operation, wenn es gesetzt wurde.
Wenn Sie darauf bestehen, mit Signale, werden Sie verschieben möchten, um mit Unterprozess anstelle von threads, wie Ihr problem ist wahrscheinlich aufgrund der GIL.
Schauen Sie sich diese Präsentation von David Beazley.
http://blip.tv/file/2232410
Es erklärt auch einige skurrile Verhalten im Zusammenhang mit threads und Signalen (Python-spezifische, nicht auf die Allgemeine Schrulligkeit des Themas 🙂 ).
http://pyprocessing.berlios.de/ Pyprocessing ist eine nette Bibliothek, die es einfacher macht die Arbeit mit getrennter Prozesse in Python.