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

您应该查看与异常一起收集的回溯——这将告诉您哪些函数正在/正在递归太深,“低于” _makeGetterFactory。很可能你会发现你自己getPageWithHeaders的递归涉及到了,这正是因为它没有正确返回一个 deferred,而是试图返回一个尚未准备好的工厂。如果您确实返回返回延期会发生什么?

于 2009-07-09T15:25:59.310 回答
-1

URL 打开器可能会遵循一系列无休止的 301 或 302 重定向。

于 2009-07-09T15:29:49.533 回答