失败时如何重试 urllib2.request?

新手上路,请多包涵

urllib2.request 超时时,将引发 urllib2.URLError 异常。重试建立连接的 pythonic 方法是什么?

原文由 iTayb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 731
2 个回答

我会使用 重试 装饰器。还有其他的,但是这个效果很好。以下是您可以如何使用它:

 @retry(urllib2.URLError, tries=4, delay=3, backoff=2)
def urlopen_with_retry():
    return urllib2.urlopen("http://example.com")

如果引发 URLError ,这将重试该函数。查看上面的链接以获取有关参数的文档,但基本上它最多会重试 4 次,每次都会以指数退避延迟加倍,例如 3 秒、6 秒、12 秒。

原文由 jterrace 发布,翻译遵循 CC BY-SA 3.0 许可协议

有一些图书馆专门从事这方面的工作。

一种是 backoff ,其设计具有特别的功能敏感性。装饰器通过任意可调用对象返回生成器,生成连续的延迟值。最大重试时间为 32 秒的简单指数退避可以定义为:

 @backoff.on_exception(backoff.expo,
                      urllib2.URLError,
                      max_value=32)
def url_open(url):
    return urllib2.urlopen("http://example.com")

另一个是 重试,它具有非常相似的功能,但 API 中的重试参数是通过预定义的关键字参数指定的。

原文由 bgreen-litl 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题