Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 失败时如何重试urllib2.request?_Python_Decorator_Urllib2_Urllib3 - Fatal编程技术网

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))