由于Twisted getPage
函数不允许我访问标题,因此我必须编写自己的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()
答案 0 :(得分:2)
您正在查看的具体追溯有点神秘。您可以尝试traceback.print_stack
而不是traceback.print_exc
来查看有问题代码上方的整个堆栈,而不仅仅是堆栈返回到捕获异常的位置。< / p>
如果没有看到更多的追溯,我无法确定,但您可能会遇到the problem where Deferreds will raise a recursion limit exception if you chain too many of them together。
如果启用延迟调试(from twisted.internet.defer import setDebugging; setDebugging(True)
),在某些情况下可能会获得更多有用的回溯,但请注意,这可能会使服务器运行速度变慢。
答案 1 :(得分:1)
你应该看看你和异常一起得到的追溯 - 它将告诉你哪些函数正在递归得太深,“在_makeGetterFactory
下面”。很可能你会发现你自己的getPageWithHeaders
参与递归,正是因为它没有正确地返回延迟,而是试图返回一个尚未准备好的工厂。如果您做返回延迟退货时会发生什么?
答案 2 :(得分:-1)
URL开启者很可能会追踪301或302重定向的无终结系列。