2009-05-29 9 views
2

dieser ist schwer zu erklären!Wirklich seltsam (mod) _python Problem

Ich schreibe eine Python-Anwendung, die über mod_python ausgeführt werden soll. Bei jeder Anforderung unterscheidet sich die zurückgegebene Ausgabe, obwohl die Logik "fest" ist.

Ich habe zwei Klassen, classA und classB. So dass:

class ClassA: 
    def page(self, req): 
     req.write("In classA page") 
     objB = ClassB() 
     objB.methodB(req) 
     req.write("End of page") 

class ClassB: 
    def methodB(self, req): 
     req.write("In methodB") 
     return None 

, die eine stark snipped Version von dem, was ich habe. Aber das Zeug, das ich geschnippelt habe, ändert den Kontrollfluss nicht. Es gibt nur einen Ort wo MethodB() heißt. Das ist von __init__() in classA.

würden Sie erwarten, dass die folgende Ausgabe:

In classA __init__ 
In methodB 
End of __init__ 

jedoch scheinbar zufällig entweder die oben korrekte Ausgabe erhalten oder:

In classA __init__ 
In methodB 
End of __init__ 
In methodB 

Der Stacktrace zeigt, dass methodB ist das zweite Mal von __init__ aufgerufen wird . methodB sollte nur einmal aufgerufen werden. Wenn es ein zweites Mal aufgerufen wird, würden Sie erwarten, dass die andere Logik in __init__ auch zweimal durchgeführt wird. Aber nichts vor oder nach methodB wird ausgeführt und es gibt keine Rekursion.

Normalerweise würde ich SO nicht zum Debuggen verwenden, aber ich habe mir eine Weile den Kopf darüber gekratzt.

Version: 2.5.2 R252: 60911

Dank im Voraus

bearbeiten Einige Hinweise, dass das Problem möglicherweise an anderer Stelle sein .... Die obigen Änderungen an das Code-Schnipsel Ergebnis in der seltsame Ausgabe 1 in jeder 250 oder so Treffern. Was ist seltsam.

Je mehr Ausgabe vor dem Ausdruck "In MethodeB", desto mehr wird es später falsch gedruckt ... im Durchschnitt, nicht im direkten Verhältnis. Es macht es sogar in Lynx.

Ich gehe zurück zum Zeichenbrett.

:(

Als Antwort auf Antwort

Es mod_python und Apache scheint Eheprobleme haben. Ein Neustart und Dinge sind in Ordnung für ein paar Anfragen. Dann geht alles immer birnenförmig. Bei der Ausgabe

/etc/rc.d/init.d/httpd stop 

es dauert unheimlich lange Menge an Zeit. auch RAM mit Anfragen aufgefressen wird immer. ich bin nicht mit Apache Interna vertraut, aber es fühlt sich wie (dank Nadia), dass Threads bleiben am Leben und nach dem Zufallsprinzip in auf Anfragen stoßen. Was ist einfach bonkers.

Umzug nach mod_wsgi als S.Lott und Nadia vorgeschlagen

danke nochmal !!

+0

Haben Sie vor, das "Selbst" auf MethodB wegzulassen? –

+0

Scheiße, zu viel schnippeln, schlecht bearbeiten. –

+2

Verwenden Sie Großbuchstaben für Klassennamen und Kleinbuchstaben für Methodennamen. Und posten Sie bitte ein Snippet, das das Problem zeigt. Die Sachen, die du gepostet hast, funktionieren wie erwartet. Kann nicht viel helfen, wenn es funktioniert. –

Antwort

4

Ich habe ähnliches Verhalten mit mod_python zuvor gesehen. In der Regel ist dies so, weil Apache mehrere Threads ausführt und einer von ihnen eine ältere Version des Codes ausführt. Wenn Sie die Seite aktualisieren, besteht die Gefahr, dass der Thread mit dem älteren Code die Seite bedient. Normalerweise behebe ich das, indem ich den Apache stoppe und ihn dann wieder neu starte

sudo /etc/init.d/apache stop 
sudo /etc/init.d/apache restart 

Neustart von selbst funktioniert nicht immer. Manchmal funktioniert das auch nicht! Das mag seltsam klingen, aber mein letzter Ausweg in den seltenen Fällen, in denen nichts funktioniert, ist das Hinzufügen einer raise Exception()-Anweisung in der ersten Zeile des Handlers, das Aktualisieren der Seite, das Neustarten von Apache und dann das erneute Aktualisieren der Seite. Das funktioniert jedes Mal. Es muss eine bessere Lösung geben. Aber das, was für mich funktionierte. mod_python kann einen verrückt machen!

Ich hoffe, das könnte helfen.

+0

Dies scheint machbar. Die Fehlerrate scheint nach einem Neustart von niedrig auf hoch zu steigen * kratzt Kinn * –

+0

Immer noch seltsam, dass die innere Methode 'out of stack' Sequenz aufgerufen wird –

+0

+1 Das ist, was ich dachte. Entfernt meine Antwort, seit Sie es besser und mit mehr Details gesagt haben. – Doug

1

Ich weiß es nicht wirklich, aber Konstruktoren sollen nichts zurückgeben, also entfernen Sie die return None. Selbst wenn sie etwas zurückgeben könnten, wird None automatisch zurückgegeben, wenn eine Funktion nichts selbst zurückgibt.

Und ich denke, Sie brauchen ein self Argument in MethodB.

EDIT: Könnten Sie mehr Code zeigen? Das funktioniert gut.

+0

Yup, diese Fehler stimmen nicht mit meiner Quelle überein, also habe ich die Frage bearbeitet und sie steht immer noch. Es wird einer dieser Doh sein! Momente. –

+0

+1 Punkt zum Lesen. Ich wusste, dass es wahrscheinlich fruchtlos wäre, weil es eine wirklich merkwürdige Präsentation ist. :) Vielen Dank! –