[Python-de] letzte Rettung

Ralf Geschke ralf at kuerbis.org
Thu May 10 10:43:56 EDT 2001


> 
> Fazit: Da man mit den persistenten Python-Interpretern wie z. B. mod_python sie
> bereitstellt, Web-*Anwendungen* schreibt, handelt es sich auch um ganz normale
> Python-Anwendungen, Unterschiede zu einer nicht-Web-Anwendung gibt es nicht.

Verstehe ich nicht. Sind die Verbindungen denn nun persistent oder 
nicht?

Der Laufzeitzyklus bei Web-Anwendungen sieht doch wie folgt aus:
-> User ruft Seite auf (HTTP-Request)
-> Apache bemerkt, dass es sich um ein Python-Skript handelt,
   reicht Anfrage an Python-Interpreter weiter (der sagen wir
   mal mit mod_snake / mod_python ein Modul des Apache ist)
-> Python verarbeitet Anfrage, oeffnet eine Datenbank, 
   sucht die notwendigen Daten zusammen, baut HTML-Seite auf,
   reicht Ergebnisse an Apache weiter
-> Apache fuehrt die Ergebnisse, somit die HTML-Seite dem Browser
   und damit dem User zu.
-> und das ganze von vorne beim naechsten Seitenaufruf...

Das Python-Programm wird folglich bei jedem Seitenaufruf
gestartet und auch wieder beendet. Bei einer "normalen"
Anwendung, etwa einer mit GUI, sieht dies voellig anders
aus, hier beendet der User das Programm, jedoch solange
damit gearbeitet wird, hat die Anwendung die Chance, globale
Variablen zu halten, insofern auch "persistente" Verbindungen
zu einer Datenbank, damit diese nicht bei jeder kleinen
Aktion wieder geoeffnet und geschlossen werden muss (etwa
bei Eingabe von Daten / Anzeige von Daten / Aenderung usw.).

Bei einer Web-Anwendung bleibt dieser aber normalerweise
gar nichts anderes uebrig, als sich staendig neu zu starten und
wieder zu beenden (Application-Server a la Zope aussen vor
gelassen, das ist eine voellig andere Welt, in der persistente
Verbindungen selbstverstaendlich sind) - und damit auch 
den Verbindungsaufbau staendig zu wiederholen. 

Bei PHP (ich komme aus der PHP-Welt ;-) ) gibt es, falls 
als Apache-Modul eingebunden, die Moeglichkeit von 
persistenten Verbindungen, z.B. bei MySQL: mysql_connect()
vs. mysql_pconnect(). Bei ersterer Funktion wird die 
Verbindung nach Ablauf des Skripts wieder geschlossen,
(kann per Funktion erledigt werden, geht aber auch
automatisch), bei mysql_pconnect() hingegen nicht, hier
haelt mod_php diese offen und benutzt sie wieder, 
falls beim naechsten Request mit den gleichen Verbindungsdaten
(Username, Datenbank, Passwort) zugegriffen wird. 

Beides hat Vor- und Nachteile. Bei hoch frequentierten Sites
ist es je nachdem, welche Datenbank verwendet wird, gar nicht
sonderlich geschickt, die Verbindungen offen zu halten, wieder
Beispiel MySQL im PHP-Center: Die offenen Verbindungen werden
einem zum Verhaengnis, da nur eine bestimmte Anzahl offen 
gehalten werden koennen (kann man einstellen), was bei 
einer grossen Anzahl von Anfragen dazu fuehren kann, dass 
es zu Engpaessen kommt. Hier war es somit sinnvoll, die
Verbindungen wieder zu schliessen, auch weil der Overhead
bei Verwendung von MySQL nicht sonderlich gross ist, 
die Oeffnung einer Verbindung faellt kaum ins Gewicht. 

Im Gegensatz dazu z.B. bei Oracle - hier kostet die Oeffnung
weitaus mehr Zeit, weshalb Persistenz erzielt werden sollte. 

Die Frage war ja nun, ob Python persistente Verbindungen kennt. 
IMHO muessten jene durch mod_python/mod_snake erreicht werden
koennen, denn bei puren Python-CGI-Skripts (in Verwendung mit
dem Apache) duerften sie kaum moeglich sein. 

Wie erwaehnt, Application Server sind eine andere Geschichte,
in diese Richtung ging ja auch die Antwort von Martin, dabei
hat man sich ja quasi selbst einen Web-Server gebastelt, 
der nun noch eine Menge mehr kann. 

Wie sieht es eigentlich bei oder mit Webware for Python aus? 
Benutzt das bereits jemand? Dabei muessten theoretisch
ebenfalls persistente Verbindungen moeglich sein, es bezeichnet
sich ja selbst als Application Server. 

Beste Gruesse,
   Ralf



More information about the Python-de mailing list