失败时如何重试urllib2.request?

时间:2012-02-25 17:46:16

标签: python urllib2 decorator

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

4 个答案:

答案 0 :(得分:57)

我会使用retry装饰器。还有其他的,但这个很好用。以下是您可以使用它的方法:

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

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

答案 1 :(得分:6)

有一些专门研究这个的图书馆。

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

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

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

答案 2 :(得分:3)

要在超时时重试,您可以将异常捕获为@Karl Barker suggested in the comment

assert ntries >= 1
for _ in range(ntries):
    try:
        page = urlopen(request, timeout=timeout)
        break # success
    except URLError as err:
        if not isinstance(err.reason, socket.timeout):
           raise # propagate non-timeout errors
else: # all ntries failed 
    raise err # re-raise the last timeout error
# use page here

答案 3 :(得分:1)

对于Python3:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseCors("CorsPolicy");

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

如果backoff_factor为0.1,则:func: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.0s,0.2s,0.4s,...]。它永远不会更长 而不是:attr:.sleep。 urllib3会休眠::

Retry.BACKOFF_MAX