Pythonのurllib
パッケージは、インターネット上のリソースを取得するためのモジュールです。しかし、ネットワークの問題やサーバーの問題により、リクエストが失敗することがあります。そのため、リトライ(再試行)の処理が必要となる場合があります。
urllibを使ったリトライ処理
以下に、urllib
を使ったリトライ処理の一例を示します。
@retry(urllib2.URLError, tries=4, delay=3, backoff=2)
def urlopen_with_retry():
return urllib2.urlopen("http://example.com")
このコードでは、urllib2.URLError
が発生した場合にリトライを行います。リトライは最大4回行い、リトライごとに待機時間が指数関数的に増加します(3秒、6秒、12秒…)。
requestsパッケージを使ったリトライ処理
また、requests
パッケージを使ってもリトライ処理を行うことができます。
import requests
from requests.packages.urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
s = requests.Session()
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
s.mount('https://', HTTPAdapter(max_retries=retries))
s.mount('http://', HTTPAdapter(max_retries=retries))
r = s.request('GET', 'http://localhost:5000', timeout=2, headers={'Authorization': 'foobar'})
r.raise_for_status()
このコードでは、500
, 502
, 503
, 504
のステータスコードが返された場合、またはリクエストがタイムアウトした場合にリトライを行います。リトライは最大5回行い、リトライごとに待機時間が指数関数的に増加します。
以上、Pythonとurllib
を使ったリトライ処理について説明しました。ネットワークの不安定さを考慮に入れると、このようなリトライ処理は非常に重要となります。