HOWTO · Python

Python でリクエストの最大再試行回数を設定する

このチュートリアルでは、Python でリクエストの max_retries を設定する方法を示します。

このチュートリアルでは、最大再試行回数を超えたというエラーが発生する理由と、Python で要求に対して max_retries を設定する方法について説明します。 また、サーバーの負荷が原因でこのエラーが発生した場合のヒントも提供します。

Requests Error に max_retries を設定する、Python での原因と解決策

Python でリクエストに max_retries を設定する方法を確認する前に、まずいくつかの問題に対処しましょう。

  • まず、このエラーは URL が正しくない場合に発生する可能性があります。 そのため、リクエストしている URL が有効かどうかを確認する必要があります。
  • このエラーは、インターネット接続が原因で発生することもあるため、そのような問題をすべてクリアしていることを確認してください。
  • サーバーの過負荷がある場合にも、このエラーが発生します。 サーバーがビジー状態の場合、このタイプのエラーが発生する可能性があります。

ここで、URL を要求するための再試行回数を増やす現象が役に立ちます。 それでは、それを行う方法を学びましょう。 しかし、まず、次のコードを見てください。

コード例:

import requests

# increass retries number
retries = 4  # enter the number of retires you want to increase
requests.adapters.DEFAULT_RETRIES = retries

これは、Python で URL 要求の再試行回数を増やす方法ですが、サーバーの負荷が原因でこのエラーが発生する場合は、次のヒントを使用できます。

注: 次のコマンドを使用して、Python に requests モジュールをインストールする必要があります。

python -m pip install requests

Python でリクエストのセット max_retries を取り除くためのヒント

サーバーの負荷が原因でこのエラーが発生する場合は、次のヒントのいずれかを使用できます。

  • keep_alive を無効にする

    セッションの keep_alive 機能を無効にすることができます。 次のコードは、その方法を説明しています。

    request_session = requests.session()
    # disable keep_alive
    request_session.keep_alive = False
    request_session.get(your_url)
    
  • タイムアウト を使用する

    サーバーが過負荷、ビジー、または場所から遠く離れている場合、これが同じエラーが発生する理由になる可能性があります. これを避けるために、応答時間を増やすことができます。

    サーバーからの POST リクエストと GET リクエストの両方で実行できます。 たとえば、次のコードを見てください。

    import requests
    
    # the time in seconds in this example is increasing time by 5
    req = requests.get(your_url, timeout=5)
    req = requests.post(your_url, timeout=5)
    

    timeout パラメータでタプルを使用することもできます。 最初のパラメーターはビルド時間を増加させ、2 番目のパラメーターは応答時間を増加させます。 コード例を以下に示します。

    req = requests.get(your_url, timeout=(3, 6))
    
  • backoff_factor (遅延/スリープ) を設定します

    backoff_factor は、ネットワーク接続を最初に設定するためにリクエストで使用される urllib3 引数です。

    backoff_factor を設定して、各試行の試行回数とスリープ時間を増やすこともできます。

    このエラーの発生を回避します。 これにより、コードの一部を停止し、サーバーの応答を受信するまで待機させます。

    次の例は、backoff_factor がサービス リクエストに失敗するたびにサービス リクエストを遅らせる方法を示しています。

    # you can set a backoff factor means delay/sleep time in each retry
    import requests
    from requests.adapters import HTTPAdapter
    from requests.packages.urllib3.util.retry import Retry
    
    # initailize the request session
    request_session = requests.Session()
    # initailizing retry object
    # you can increase the number of total retires and sleep time of each retry
    retries = Retry(total=3, backoff_factor=1)
    adapter = HTTPAdapter(max_retries=retry)
    request_session.mount("http://", adapter)
    request_session.get(your_url)
    

    urllib3 ドキュメント によると、backoff_factor は、ライブラリが再試行間のスリープ間隔を決定するために使用する基本値です。

    たとえば、接続試行が失敗するたびに、urllib3{backoff_factor} * (2 (合計再試行回数 - 1)) 秒間スリープします。

    たとえば、backoff_factor0.01 に設定されている場合、sleep()0.0s0.2s0.4s、… 再試行の間にスリープします。 バックオフはデフォルトでは非アクティブです (0 に設定)。

    返されたステータス コードが 500502503、または 504 の場合、さらに再試行が要求されます。 再試行をさらに細かく制御するために、再試行を変更できます。