
Hallo,
ich hab mir als ein Bastler-Projekt einen Daemon gebaut, welcher aus seiner Config einen Haufen Objekte baut, diese zur Laufzeit mit Zustandsinformationen anreichert und den ganzen Kram auf dem DBus exportiert. Das ganze garniert mit einer Client-Library, welche ein Fremdprozess benutzen kann, um die gleichen Objekte mit möglichst den gleichen Informationen drin zu haben.
Ich möchte jetzt eine Django-Webapp bauen, die diesen Zustand bunt zum Klicken darstellen kann. Dazu instanziere ich meine Client-Library und lese aus dem resultierenden Objekthaufen gemütlich alle Infos raus die ich dazu brauche. So weit, so gut.
Spannend wird es bei der Frage, wie ich mit meinem Objekthaufen auf dem neuesten Stand bleibe.
Die einfachste Methode ist natürlich, in der View für jeden Request einen neuen Objekthaufen zu erzeugen, in dem dann der aktuelle Stand drinsteht. Das klingt aber verschwenderisch und nach ekligem Design. Da das ganze ein Bastler-Projekt ohne Deadlines ist, kann ich es mir leisten, sowas nicht zu wollen. ;)
Schöner finde ich, einen Thread zu erzeugen, der im Hintergrund auf DBus-Signale von meinem Daemon wartet und dann den Objekthaufen entsprechend anpasst. Dann hab ich nicht nur ständig aktuelle Informationen, ich spare mir auch die Latenz einer Abfrage über den DBus. Und wenn mein Daemon grade mal neu gestartet wird (crashen würde der nie!) steht die Web-Oberfläche trotzdem noch zur Verfügung, sie ist halt nur erstmal outdated.
Den Thread zu erzeugen ist an sich auch kein Problem, aber wie werde ich ihn wieder sauber los, wenn "./manage.py runserver" ein ^c empfängt oder der WSGI-Daemon-Prozess vom Apache gekillt wird? Wird der Prozess überhaupt gekillt, oder fällt nur das WSGI-Script aus dem Scope und wird Garbage-collected?
Ich habe in der WSGI-Doku[0] einen Hinweis auf atexit gefunden, und daraufhin mal probiert in meiner views.py einen Thread zu erzeugen. Dieser schreibt alle zwei Sekunden ein "Hallo" in die Konsole, bis er von irgendwem das Signal bekommt, damit aufzuhören. Wenn ich nun "./manage.py runserver" ausführe, sehe ich auch meine Hallos. Leider wird der Thread nach einem ^c nicht beendet, sondern läuft im Hintergrund weiter, bis ich den Prozess hart kille. Ich vermute dass der Thread hier verhindert dass atexit aufgerufen wird, weil der Prozess sich ja bei ^c nicht mehr beendet (sondern nur der Vordergrund-Thread).
Wie geht das richtig?
Viele Grüße und einen schönen Sonntag,
Michael
[0] http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode#Cleanup_On_Proc...

Thread.setDaemon(True) ist dein Freund.
Am 30.09.2012 um 12:40 schrieb Michael Ziegler diese-addy@funzt-halt.net:
Hallo,
ich hab mir als ein Bastler-Projekt einen Daemon gebaut, welcher aus seiner Config einen Haufen Objekte baut, diese zur Laufzeit mit Zustandsinformationen anreichert und den ganzen Kram auf dem DBus exportiert. Das ganze garniert mit einer Client-Library, welche ein Fremdprozess benutzen kann, um die gleichen Objekte mit möglichst den gleichen Informationen drin zu haben.
Ich möchte jetzt eine Django-Webapp bauen, die diesen Zustand bunt zum Klicken darstellen kann. Dazu instanziere ich meine Client-Library und lese aus dem resultierenden Objekthaufen gemütlich alle Infos raus die ich dazu brauche. So weit, so gut.
Spannend wird es bei der Frage, wie ich mit meinem Objekthaufen auf dem neuesten Stand bleibe.
Die einfachste Methode ist natürlich, in der View für jeden Request einen neuen Objekthaufen zu erzeugen, in dem dann der aktuelle Stand drinsteht. Das klingt aber verschwenderisch und nach ekligem Design. Da das ganze ein Bastler-Projekt ohne Deadlines ist, kann ich es mir leisten, sowas nicht zu wollen. ;)
Schöner finde ich, einen Thread zu erzeugen, der im Hintergrund auf DBus-Signale von meinem Daemon wartet und dann den Objekthaufen entsprechend anpasst. Dann hab ich nicht nur ständig aktuelle Informationen, ich spare mir auch die Latenz einer Abfrage über den DBus. Und wenn mein Daemon grade mal neu gestartet wird (crashen würde der nie!) steht die Web-Oberfläche trotzdem noch zur Verfügung, sie ist halt nur erstmal outdated.
Den Thread zu erzeugen ist an sich auch kein Problem, aber wie werde ich ihn wieder sauber los, wenn "./manage.py runserver" ein ^c empfängt oder der WSGI-Daemon-Prozess vom Apache gekillt wird? Wird der Prozess überhaupt gekillt, oder fällt nur das WSGI-Script aus dem Scope und wird Garbage-collected?
Ich habe in der WSGI-Doku[0] einen Hinweis auf atexit gefunden, und daraufhin mal probiert in meiner views.py einen Thread zu erzeugen. Dieser schreibt alle zwei Sekunden ein "Hallo" in die Konsole, bis er von irgendwem das Signal bekommt, damit aufzuhören. Wenn ich nun "./manage.py runserver" ausführe, sehe ich auch meine Hallos. Leider wird der Thread nach einem ^c nicht beendet, sondern läuft im Hintergrund weiter, bis ich den Prozess hart kille. Ich vermute dass der Thread hier verhindert dass atexit aufgerufen wird, weil der Prozess sich ja bei ^c nicht mehr beendet (sondern nur der Vordergrund-Thread).
Wie geht das richtig?
Viele Grüße und einen schönen Sonntag,
Michael
[0] http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode#Cleanup_On_Proc...
-- Öffentlicher Schlüssel: 48F81543 - Michael Ziegler (Svedrin) Wo kämen wir denn da hin, wenn jeder nur fragte "Wo kämen wir denn da hin?", aber niemand ginge, um zu sehen, wohin wir kämen, wenn wir gingen? (Autor unbekannt) _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de

Hallo Diez,
On 30.09.2012 13:27, Diez B. Roggisch wrote:
Thread.setDaemon(True) ist dein Freund.
Das Leben kann so einfach sein. Funktioniert traumhaft.
Danke dir :)
Michael
participants (2)
-
Diez B. Roggisch
-
Michael Ziegler