Day 127dequeでレート制限用のスライディングウィンドウ
Pythonコード
1from collections import deque2 3def rate_limiter(max_requests, time_window):4 queue = deque()5 while True:6 request_time = input("リクエスト時間を入力してください (秒): ")7 try:8 request_time = int(request_time)9 except ValueError:10 print("無効な入力です。整数を入力してください。")11 continue12 queue.append(request_time)13 while queue and queue[0] < request_time - time_window:14 queue.popleft()15 if len(queue) > max_requests:16 print("レート制限に達しました。")17 else:18 print("リクエストを受け付けました。")19 20rate_limiter(5, 60)
解説
- 行1〜2: collectionsモジュールからdequeをインポートします。dequeは、両端から要素を追加または削除できるデータ構造です。rate_limiter関数を定義します。この関数は、レート制限の最大リクエスト数と時間ウィンドウを受け取ります。
- 行3〜4: キューを初期化し、無限ループでリクエスト時間の入力を繰り返します。入力されたリクエスト時間を整数に変換します。int()関数は、文字列を整数に変換する関数です。
- 行5〜10: リクエスト時間をキューに追加します。キューの先頭の要素が時間ウィンドウより古い場合は、キューから削除します。input()関数は、ユーザーの入力を読み取る関数です。try-exceptブロックは、入力が整数でない場合にエラーを処理します。
- 行11〜14: キューの要素数が最大リクエスト数を超えている場合は、レート制限に達したことを表示します。そうでない場合は、リクエストを受け付けたことを表示します。len()関数は、キューの要素数を返します。
- 行15: rate_limiter関数を呼び出し、最大5リクエスト、時間ウィンドウ60秒でレート制限を開始します。
- 行15: 補足: len() は要素数(長さ)を返す関数です。print() は画面に文字や値を表示する関数です。
次に試してみよう
- 時間ウィンドウを変化させて、レート制限の動作を確認してみましょう。
- 最大リクエスト数を変更して、レート制限の影響を観察してみましょう。
- 入力されたリクエスト時間に基づいて、レート制限のログを出力してみましょう。