mod_python - caching == Verzweiflung :-(

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Zuletzt bearbeitet: 31.10.2005 08:36
Moin!
Habe hier gepostet, weil ich glaube, dass es ein mod_python-Problem ist.

Folgendes Ding: Ich benutze mod_python und mache an einer Stelle im handler sowas:

Code: Alles auswählen

class Something:
  def set_x(self, x):
     self.inst.x = x
     print repr(self.inst) # XXX
  x = property(get_x, set_x)

# ...

def a_func_thatll_be_called_early:
  global S, obj
  S = Something()
  # ...
  obj = OtherClass()
  S.inst = obj # ZUWEISUNG
  print repr(obj)

def another_func_thatll_be_called_later:
  global S, obj
  print repr(obj) # YYY
Das klappt, wenn man es einmal aufruft wunderbar, wenn man es aber gleich danach nochmal aufruft (also die Seite neu lädt), gibt die mit XXX markierte Zeile noch die Instanz vom letzten Durchlauf an, während die Zeile YYY brav den Wert ausgibt, der in der Zwile ZUWEISUNG gesetzt wird!

Hat jemand eien Erklärung für dieses absolut unberechenbare Verhalten? Ich hätte schon gerne, dass eine Variable wirklich den Wert hat, den ich ihr zuweise und nicht irgendeinen den sie vorher mal hatte (und das noch nichtmal konsequent)!

Bitte helft mir, ich bin am verzweifeln! (So kann ich ja nicht weiter coden :-()
BlackJack

Ein Fehler ist auf jeden Fall, das `Something` nicht von `object` abgeleitet ist. Wenn man das nicht macht, dann funktionieren Properties nicht richtig.

Und dann ist `global` böse! Nicht benutzen! :twisted:

Kann es sein, das eine neue Verbindung einen neuen Thread startet und dann zwei konkurrierend auf die globalen Objekte im Modul zugreifen? Dann sind Schmutzeffekte vorprogrammiert.
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Ich denke sowas in der Art wird es sein.
Das Hauptproblem wird wohl an sich gewesen sein, dass ich eine erstaunlichlange Zeit mod_python programmiert habe ohne zu verstehen, dass es wichtige Unterschiede im Ladeverhalten gegenüber CGI gibt und meine Module nicht zwingend bei jedem request neu geladen werden.

Hmm... In meinem mod_python ist ein 2.3 verbaut, habe ich da schon object? oder kann ich property dann gar nicht nutzen?

Warum genau ist global böse?
BlackJack

henning hat geschrieben:Ich denke sowas in der Art wird es sein.
Das Hauptproblem wird wohl an sich gewesen sein, dass ich eine erstaunlichlange Zeit mod_python programmiert habe ohne zu verstehen, dass es wichtige Unterschiede im Ladeverhalten gegenüber CGI gibt und meine Module nicht zwingend bei jedem request neu geladen werden.
Es wird insgesamt nur einmal geladen. Zumindest gibt's pro virtueller Domain einen Python-Interpreter in der Standardkonfiguration.
Hmm... In meinem mod_python ist ein 2.3 verbaut, habe ich da schon object? oder kann ich property dann gar nicht nutzen?
Wenn es `property()` gibt, dann gibt's auch `object`. Würde sonst wenig Sinn machen `property()` zu haben, wenn es ohne `object` nicht funktioniert. ;-)
Warum genau ist global böse?
Weil man damit Funktionen voneinander abhängig macht, ohne das man einfach nachverfolgen kann, welche miteinander gekoppelt sind. Und bei nebenläufigem Zugriff auf gemeinsame Daten wird's dann "lustig", wie Du gesehen hast.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

object sollte schon seit Python 2.2 dabei sein (2.2.1 glaube ich).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

Wenn ich dir einen Tip nur so am Rande geben darf... Schmeiss den mod_python Krempel weg... Es gibt ne ganze Menge sehr viel bessere Toolkits um mit Python WebApps zu bauen...

Sebastian

PS: Ich spreche hier aus eigener leidiger Erfahrung... Versuch mal, mit mod_python eine persistente Datenbankverbindung zu machen, die von allen threads genutzt werden kann... das geht böse in die Hose.
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Danke für den Hinweis, aber er war leider nur eingeschränkt konstruktiv ,-)

Ander gesagt: Was ist denn z.B. besser?
Ich habe jetzt auch schon viel in mod_python für das Ding gemacht und hab eher wenig Bock alles zu portieren...
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

henning hat geschrieben: Ander gesagt: Was ist denn z.B. besser?
Wie gesagt.. Ich bin absoluter CherryPy Verfechter, es ist recht schnell zu erlernen, einfach zu benutzen aber absolut mächtig in den Möglichkeiten.

Es gibt da sogar ein Rezept, das dürfte deinen Geschmack recht gut treffen: How to use Cheetah Template with caching from CherryPy. Sonst kenn ich noch Webware und Zope. Ich finde, beide ziemlichen Overkill... man kriegt natürlich auch ne Menge dafür, aber mein Fall ist es nicht, das ist aber Geschmackssache.

Gruss

Sebastian
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

raist1314 hat geschrieben:Wenn ich dir einen Tip nur so am Rande geben darf... Schmeiss den mod_python Krempel weg... Es gibt ne ganze Menge sehr viel bessere Toolkits um mit Python WebApps zu bauen...
Ein Wort: WSGI
Das läuft dann auch unter FastCGI und Konsonsorten.
TUFKAB – the user formerly known as blackbird
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

blackbird hat geschrieben: Ein Wort: WSGI
So wie ich das sehe, ist WSGI aber eher was für den Framework Enwickler als für den Entwickler, der das Framework benutzt oder? Die Abstraktion im WSGI wäre mir als Entwickler einer Webapplikation viel zu gering oder hab ich da was falsch verstanden?

Sebastian
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

raist1314 hat geschrieben:So wie ich das sehe, ist WSGI aber eher was für den Framework Enwickler als für den Entwickler, der das Framework benutzt oder? Die Abstraktion im WSGI wäre mir als Entwickler einer Webapplikation viel zu gering oder hab ich da was falsch verstanden?
Du hast was falsch verstanden. WSIG ist für den Entwickler einer Anwendung. Nicht für den Framework Entwickler.
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Paste ist in etwa mit Webware und WSGI verwandt: es war als Webware-WSGI Rewrite geplant.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten