2

TwistedgetPage関数ではヘッダーにアクセスできないため、独自のgetPageWithHeaders関数を作成する必要がありました。

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

これは通常の関数とまったく同じですがgetPage、try/except ブロックを追加し、factory.deferred を返す代わりにファクトリ オブジェクトを返します。

何らかの理由で、ここで最大再帰深度を超えたエラーが発生することがあります。700 回のうち数回は一貫して発生し、通常は毎回異なるサイトで発生します。誰でもこれに光を当てることができますか?なぜ、どのようにこれが起こっているのかはわかりません。また、Twisted のコードベースは非常に大きく、どこを見ればよいかさえわかりません。

編集:ここに私が得たトレースバックがありますが、これは奇妙に不完全なようです:

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

これはトレースバック全体であり、再帰の最大深度を超えるほど長くはありません。完全なスタックを取得するために他に何かする必要がありますか? 私はこれまでこの問題を経験したことがありません。通常、私が何かをするとき

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

次に、あなたが期待するような「最大再帰深度を超えた」スタックを取得し、大量の参照を取得しますf()

4

3 に答える 3

2

あなたが見ている特定のトレースバックは少し不可解です。例外がキャッチされた場所に戻るスタックだけでなく、問題のあるコードの上のスタック全体を見るのではtraceback.print_stackなく、試すことができます。traceback.print_exc

あなたのトレースバックをもっと見ないと確信は持てませんが、 Deferreds を連鎖させすぎると再帰制限の例外が発生するという問題に直面している可能性があります。

遅延デバッグ ( ) をオンにするfrom twisted.internet.defer import setDebugging; setDebugging(True)と、より有用なトレースバックが得られる場合がありますが、サーバーの速度がかなり低下する可能性があることに注意してください。

于 2009-07-10T10:38:43.147 に答える
1

例外と一緒に取得しているトレースバックを確認する必要があります。これにより、どの関数が「下」で再帰的になりすぎているかがわかります_makeGetterFactorygetPageWithHeadersほとんどの場合、遅延オブジェクトを適切に返す代わりに、まだ準備ができていないファクトリを返そうとするため、自分自身が再帰に関与していることに気付くでしょう。遅延を返すことに戻ったらどうなりますか?

于 2009-07-09T15:25:59.310 に答える
-1

URL オープナーは、終わりのない一連の 301 または 302 リダイレクトに従っている可能性があります。

于 2009-07-09T15:29:49.533 に答える