当urllib2.request
达到超时时,会引发urllib2.URLError
异常。
重试建立连接的pythonic方法是什么?
答案 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