Python 失败时如何重试urllib2.request?
当Python 失败时如何重试urllib2.request?,python,decorator,urllib2,urllib3,Python,Decorator,Urllib2,Urllib3,当urllib2.request达到超时时,将引发urllib2.urleror异常。 重试建立连接的python方法是什么?我会使用装饰器。还有其他的,但是这个很好用。以下是如何使用它: @retry(urllib2.URLError, tries=4, delay=3, backoff=2) def urlopen_with_retry(): return urllib2.urlopen("http://example.com") 如果引发URLError,将重试该函数。请查看上面
urllib2.request
达到超时时,将引发urllib2.urleror
异常。
重试建立连接的python方法是什么?我会使用装饰器。还有其他的,但是这个很好用。以下是如何使用它:
@retry(urllib2.URLError, tries=4, delay=3, backoff=2)
def urlopen_with_retry():
return urllib2.urlopen("http://example.com")
如果引发
URLError
,将重试该函数。请查看上面的链接以获取有关参数的文档,但基本上它最多会重试4次,每次的退避延迟将是指数级的两倍,例如3秒、6秒、12秒。要在超时时重试,您可以捕获以下异常:
有一些图书馆专门从事这方面的工作 一个是,它的设计具有特别的功能敏感性。修饰符被传递给返回生成器的任意可调用项,这些生成器产生连续的延迟值。最长重试时间为32秒的简单指数退避可定义为:
@backoff.on_exception(backoff.expo,
urllib2.URLError,
max_value=32)
def url_open(url):
return urllib2.urlopen("http://example.com")
另一个是具有非常类似功能的API,其中通过预定义的关键字args指定重试参数。对于Python3:
from urllib3 import Retry, PoolManager
retries = Retry(connect=5, read=2, redirect=5, backoff_factor=0.1)
http = PoolManager(retries=retries)
response = http.request('GET', 'http://example.com/')
如果退避系数为0.1,则:func:.sleep
将休眠
对于重试之间的[0.0s、0.2s、0.4s,…]。不会再长了
超过:attr:重试。后退\u MAX
。
urllib3将睡眠时间::
{backoff factor} * (2 ** ({number of total retries} - 1))
这个问题应该能回答你的问题:我没有问你如何抓住期望。我想知道是否有一种python方法可以重试建立连接。对不起,我假设问题在于检测到超时,而不是重新建立连接。您不能在异常块中调用urlopen()吗?这是可能的,但看起来不太像python。如果我想重试三次,我将不得不嵌套try-except块,它看起来很难看。这可能会有所帮助:这是一个非常酷的片段。你知道另一种方法吗,但是作为上下文管理器?嗯,我认为你可以很容易地将它重写为上下文管理器,但我没有现成的方法。这不容易做到,因为没有简单的方法来捕获with语句中的块。你需要深刻反省。不,我不认为那是真的。异常在产生后在上下文管理器中重新引发。问题不在于异常,而在于引发异常的代码。如果无法运行代码,如何重试?Python中没有匿名集团的概念。这是可行的,但不是直观的。
{backoff factor} * (2 ** ({number of total retries} - 1))