PythonでAPIのリクエストレート制限を実装する方法

この記事では、Pythonを使用してAPIのリクエストレート制限(Throttling)を設定する方法について解説します。具体的なコード例とその詳細な解説、さらには応用例も含めて説明していきます。

目次

リクエストレート制限とは

リクエストレート制限は、特定の期間内で許可されるAPIのリクエスト回数を制限するテクニックです。これによって、サービスへの過度な負荷を防ぐとともに、リソースを効率的に配分することができます。

Pythonでの基本的なリクエストレート制限の設定方法

Pythonでは、リクエストレート制限を手軽に設定できるいくつかのライブラリがありますが、今回は基本的な方法として、timeモジュールを使用して独自に制限をかける方法を解説します。

time.sleep()を使用した基本例

最も簡単な方法は、timeモジュールのsleep関数を使用することです。

import time
import requests

for i in range(5):
    # APIリクエスト
    response = requests.get("https://api.example.com/data")
    print(response.json())
  
    # 1秒待機
    time.sleep(1)

この例では、1秒に1回APIにリクエストを送る制限を設けています。

コードの詳細解説

– `import time`: timeモジュールをインポートします。
– `import requests`: requestsライブラリをインポートします。
– `for i in range(5)`: 5回APIにリクエストを送るループです。
– `response = requests.get(“https://api.example.com/data”)`: APIからデータを取得します。
– `print(response.json())`: JSONデータを出力します。
– `time.sleep(1)`: 1秒待機します。

応用例1: レスポンスステータスに応じて待機時間を調整

import time
import requests

for i in range(5):
    response = requests.get("https://api.example.com/data")
    
    if response.status_code == 429:
        time.sleep(5)
    else:
        print(response.json())
        time.sleep(1)

コードの詳細解説

– `if response.status_code == 429`: ステータスコードが429(Too Many Requests)であれば、5秒待機します。
– `else`: それ以外の場合は、1秒待機します。

応用例2: デコレータを使用したレート制限

from functools import wraps
import time

def rate_limited(max_per_second):
    interval = 1.0 / max_per_second
    
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            time.sleep(interval)
            return func(*args, **kwargs)
        return wrapper
    return decorator

@rate_limited(1)
def fetch_data():
    response = requests.get("https://api.example.com/data")
    print(response.json())

for i in range(5):
    fetch_data()

コードの詳細解説

– `from functools import wraps`: `wraps`関数をインポートします。
– `def rate_limited(max_per_second)`: デコレータ関数を定義します。
– `@rate_limited(1)`: fetch_data関数にレート制限を適用します。

まとめ

PythonでAPIのリクエストレート制限を実装する方法にはいくつかの手法があります。基本的な`time.sleep()`を使用する方法から、レスポンスステータスに応じて待機時間を調整する方法、さらにはデコレータを使用した高度な制限方法まで、ニーズに応じて選択することができます。

コメント

コメントする

目次