WSGI-Verständnisfrage

Django, Flask, Bottle, WSGI, CGI…
Antworten
janis96
User
Beiträge: 3
Registriert: Sonntag 20. Mai 2012, 15:57

Hallo,

ich habe eine Frage bezüglich WSGI. Eine Lowlevel-WSGI-Python-Anwendung wird doch nicht bei jeder Anfrage neu geladen, sondern einmal gestartet und dann bei jeder Anfrage nur die entsprechende Funktion aufgerufen, oder?

Das hieße ja, dass ich zu Beginn der Anwendung einigermaßen aufwendige Sachen ausführen/intitialisieren kann, da die Anwendung an sich ja nur einmal geladen wird. Das hieße aber doch auch, dass ich globale Variablen benutzen kann, die auch nach mehreren Aufrufen noch vorhanden sind.

Lange Rede, kurzer Sinn: Funktioniert folgendes Skript? :?

Code: Alles auswählen

# Dieser Code wird nur einmal ausgeführt
import xyz
xyz.init()
#[...]

def app(environ, start_response):
    # Dieser Code wird bei jedem Aufruf ausgeführt
    #[...]
Vielen Dank im Voraus, Janis. :)
BlackJack

@janis96: Das funktioniert nicht so ohne weiteres. Es ist weder garantiert, dass die WSGI-Anwendung ständig läuft, noch dass sie nur einmal zur gleichen Zeit läuft. Du kannst Dich also nicht auf persistente, globale Werte innerhalb der Anwendung verlassen. Man kann WSGI auch über CGI anbinden, dann wird pro Anfrage die Anwendung ausgeführt und danach beendet. Man kann es aber auch über FastCGI anbinden, und da gibt es oft viele Einstellungsmöglichkeiten, dass zum Beispiel mehrere parallele Exemplare bestehen, bei höherer Nachfrage noch mehr gestartet werden, bei geringerer Nachfrage welche wieder beendet werden, oder auch das generell nach einer gewissen Laufzeit die Prozesse beendet und neu gestartet werden.
deets

BlackJack hat natuerlich recht - der Standard garantiert nix. Konkret existierende WSGI-Server wie gunicorn, paster und Co aber haben da schon ein wohldefiniertes Verhalten, und lassen Prozesse laenger leben.
lunar

@deets: Wenn man sich auf das Verhalten einer WSGI-Implementierung verlässt, verliert man natürlich den Vorteil der Unabhängigkeit vom konkreten Server. Das ist per se nichts schlechtes, aber man muss sich dessen halt bewusst sein.

Insofern ist es für jemanden, der neu ist in der Python-Webentwicklung, wohl besser, über das Verhalten von WSGI keine Annahmen zu treffen, und per se davon auszugehen, dass jeder Request einen eigenen Prozess erhält.
janis96
User
Beiträge: 3
Registriert: Sonntag 20. Mai 2012, 15:57

Vielen Dank für eure Antworten! Dass ich mich nicht auf globale Werte verlassen kann, habe ich mir schon fast gedacht. :( Kann ich aber davon ausgehen, dass bei den meisten Implementierungen (FastCGI?) zumindest nicht ein Prozess pro Anfrage läuft, sondern ich ruhig einen etwas aufwendigeren Code zu Beginn der Anwendung ausführen kann? Das ich mich dann etwas einschränken würde, würde mich nicht wirklich stören. Konkret: Wie sieht es mit mod_wsgi und dem Python-FCGI-Modul aus?

mfg Janis :)


edit: Das Programm würde ja auch immer noch unter jedem WSGI-Server laufen, nur halt nicht mehr so flüssig.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Natürlich kannst du davon ausgehen, wenn man es nicht könnte würde man CGI nehmen. Dir sollte halt nur klar sein wie der worst case aussieht und auf welchen Platformen du deine Anwendung laufen lassen willst, insbesondere wenn du sowas wie GAE oder Heroku nutzen willst.
janis96
User
Beiträge: 3
Registriert: Sonntag 20. Mai 2012, 15:57

Super, vielen Dank! Das hat mir sehr geholfen. :)
Antworten