2009-07-09 8 views
2

Da die Twisted getPage Funktion mir keinen Zugriff auf die Header gibt, musste ich meine eigene getPageWithHeaders Funktion schreiben.Twisted manchmal wirft (scheinbar unvollständig) 'maximale Rekursion Tiefe überschritten' RuntimeError

def getPageWithHeaders(contextFactory=None, *args, **kwargs): 
    try: 
     return _makeGetterFactory(url, HTTPClientFactory, 
            contextFactory=contextFactory, 
            *args, **kwargs) 
    except: 
     traceback.print_exc() 

Das ist genau die gleiche wie die normale getPage Funktion, mit der Ausnahme, dass ich den Try/außer Block hinzugefügt und senden Sie das Factory-Objekt anstatt das Aus irgendeinem Grund factory.deferred

Rückkehr, bekomme ich manchmal eine maximale Rekursionstiefe hat hier den Fehler überschritten. Es passiert konsistent einige Male von 700, in der Regel an verschiedenen Standorten jedes Mal. Kann irgendjemand etwas dazu sagen? Mir ist nicht klar, warum oder wie das passieren könnte, und die Twisted-Codebasis ist groß genug, dass ich nicht einmal weiß, wo ich suchen soll.

EDIT: Hier ist die Zurückverfolgungs ich, die bizarr unvollständig scheint:

Traceback (most recent call last): 
    File "C:\keep-alive\utility\background.py", line 70, in getPageWithHeaders 
    factory = _makeGetterFactory(url, HTTPClientFactory, timeout=60 , contextFactory=context, *args, **kwargs) 
    File "c:\Python26\lib\site-packages\twisted\web\client.py", line 449, in _makeGetterFactory 
    factory = factoryFactory(url, *args, **kwargs) 
    File "c:\Python26\lib\site-packages\twisted\web\client.py", line 248, in __init__ 
    self.headers = InsensitiveDict(headers) 
RuntimeError: maximum recursion depth exceeded 

Dies ist der gesamte Rückverfolgungs, die eindeutig nicht lang genug ist, um unsere max Rekursionstiefe überschritten. Gibt es noch etwas, was ich tun muss, um den vollen Stapel zu bekommen? Ich hatte dieses Problem noch nie zuvor. normalerweise auf, wenn ich etwas tun, wie

def f(): return f() 
try: f() 
except: traceback.print_exc() 

dann bekomme ich die Art von „maximale Rekursionstiefe überschritt“ Stack, den man erwarten würde, mit einer Tonne von Verweisen auf f()

+2

Nur zur Info: dass "_" vor _makeGetterFactory bedeutet "nenne das nicht". Es ist ein privates Implementierungsdetail. Es wird ohne Warnung unterbrochen, wenn Sie eine neue Version von Twisted installieren. – Glyph

Antwort

1

Sie an der Zurückverfolgungs aussehen sollten Sie mit der Ausnahme zusammenkommen - das sagt Ihnen, welche Funktion (en) zu tief rekurriert, "unter" _makeGetterFactory. Höchstwahrscheinlich werden Sie feststellen, dass Ihre eigene getPageWithHeaders an der Rekursion beteiligt ist, genau weil, anstatt eine deferred korrekt zurückzugeben, versucht wird, eine Factory zurückzuschicken, die noch nicht fertig ist. Was passiert, wenn Sie tun gehen zurück zu den zurückgestellten?

+0

Ich habe das Traceback zu meiner Frage hinzugefügt. Wie für zurück zu getPage, interessanterweise, ich manchmal getPage aufrufen und manchmal getPageWithHeaders, und dieses Problem tritt nie mit getPage. Ich vermute also, dass meine Funktion dieses Problem irgendwie verursacht, obwohl ich unmöglich sehen kann, wie. –

-1

Der URL-Öffner folgt wahrscheinlich einer nicht endenden Serie von 301- oder 302-Weiterleitungen.

2

Die spezifische Rückverfolgung, die Sie betrachten, ist ein bisschen verwirrend. Sie könnten versuchen traceback.print_stack statt traceback.print_exc, um einen Blick auf den gesamten Stapel über den problematischen Code zu werfen, anstatt nur den Stapel zurück zu gehen, wo die Ausnahme abgefangen wird.

Ohne mehr von Ihrem Traceback zu sehen, kann ich nicht sicher sein, aber Sie können in laufen.

Wenn Sie Deferred Debugging (from twisted.internet.defer import setDebugging; setDebugging(True)) aktivieren, erhalten Sie in einigen Fällen möglicherweise nützlichere Trace-Backs, aber bitte beachten Sie, dass dies auch Ihren Server ziemlich verlangsamen kann.

Verwandte Themen