[Python-de] CGI Performance

"Martin v. Löwis" martin at v.loewis.de
Mon Aug 2 00:57:04 CEST 2004


Ralf Schönian wrote:
> CGI Skripte haben ja bekanntlich ein Performance Problem. Haette ich das
> mal frueher gewusst :-)

Das ist zwar richtig, aber vielleicht seltener ein Problem, als man
denkt. Wenn Dein Script zu langsam ist, liegt es vielleicht daran, dass
es inherent zu langsam ist - und nicht daran, dass der Interpreter
jedesmal neu starten muss.

> Kann ich dieses umgehen, indem ich den CGIHTTPServer einsetze? 

Nicht direkt, nein.

> Im Apache habe ich fuer meine Skripte einige Pfade und Umgebungsvariablen 
 > gesetzt. Ist dies auch mit dem CGIHTTPServer möglich

Ich weiß nicht genau, was Du meinst, dass Du "im Apache"
Umgebungsvariablen und Pfade gesetzt hast. Mit welchen Apache-Direktiven
denn genau? Es hängt von der konkreten Direktive ab, ob man sowas für
CGIHTTPServer auch haben kann. Auf keinen Fall unterstützt der
gegenwärtig Apache-Konfigurationsdateien.

 > und sehe ich es richtig,
> dass der Python Interpreter nicht fuer jedes Python CGI Skript neu
> gestartet wird, weil er ja schon fuer den Serverdienst laeuft?

Nein. CGI legt fest, dass jedesmal ein neuer Prozess gestartet werden
muss, und daran hält sich CGIHTTPServer (sofern das System fork(2) hat).

> Kennt jemand noch einen anderen Weg als den CGIHTTPServer um die
> Performance zu verbessern?  

Ich würde mal untersuchen, warum das Skript so langsam ist. Vermutlich
liegt es nicht daran, dass es als CGI läuft.

> mod_python hat einen cgihandler, aber der
> soll etwas buggy sein (lt. Google-Suche).

Nun ja. Der funktioniert so gut, wie er theoretisch überhaupt
funktionieren kann.

Wenn man nicht jedesmal die Startup-Kosten wieder haben will (was ja
Dein Ziel ist), dann muss man die Variablen des "letzten" Laufs
aufheben. Das widerspricht klar der CGI-Semantik; ein Ansatz, der
also die Startup-Kosten vermeidet, *muss* etwas buggy sein. Ob das
bei Dir ein Problem ergibt, hängt vom Skript ab. Wenn Du
beispielsweise erwartest, dass beim ersten "import foo" der
Initialisierungscode von foo ausgeführt wird, dann wird Dich ein
"verbesserter" CGI-Handler vielleicht enttäuschen, weil er ja gerade
die Initialisierung von foo umgeht. Damit hätten dann die globalen
Variablen in foo immernoch den Wert, den sie beim letzten Mal hatten.

Ciao,
Martin