[Python-de] Threads in Django

Diez B. Roggisch deets at web.de
So Sep 30 13:27:14 CEST 2012


Thread.setDaemon(True) ist dein Freund. 

Am 30.09.2012 um 12:40 schrieb Michael Ziegler <diese-addy at 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_Process_Shutdown
> 
> -- 
> Ö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 at python.org
> http://mail.python.org/mailman/listinfo/python-de
> 


Mehr Informationen über die Mailingliste python-de