When urllib2.request
reaches timeout, a urllib2.URLError
exception is raised. What is the pythonic way to retry establishing a connection?
This function always returns an object which can work as a context manager and has the properties url, headers, and status. See urllib.
The data returned by urlopen() or urlretrieve() is the raw data returned by the server. This may be binary data (such as an image), plain text or (for example) HTML. The HTTP protocol provides type information in the reply header, which can be inspected by looking at the Content-Type header.
NOTE: urllib2 is no longer available in Python 3 You can get more idea about urllib.
Urllib package is the URL handling module for python. It is used to fetch URLs (Uniform Resource Locators). It uses the urlopen function and is able to fetch URLs using a variety of different protocols.
There are a few libraries out there that specialize in this.
One is backoff, which is designed with a particularly functional sensibility. Decorators are passed arbitrary callables returning generators which yield successive delay values. A simple exponential backoff with a maximum retry time of 32 seconds could be defined as:
@backoff.on_exception(backoff.expo, urllib2.URLError, max_value=32) def url_open(url): return urllib2.urlopen("http://example.com")
Another is retrying which has very similar functionality but an API where retry parameters are specified by way of predefined keyword args.
I would use a retry decorator. There are other ones out there, but this one works pretty well. Here's how you can use it:
@retry(urllib2.URLError, tries=4, delay=3, backoff=2) def urlopen_with_retry(): return urllib2.urlopen("http://example.com")
This will retry the function if URLError
is raised. Check the link above for documentation on the parameters, but basically it will retry a maximum of 4 times, with an exponential backoff delay doubling each time, e.g. 3 seconds, 6 seconds, 12 seconds.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With