を作るとき、私は何度も何度も同じサーバを呼び出すためにPythonの睡眠10のリクエスト
requests.get()
を使用していますが、私は毎分30のリクエストに制限されています。 30件のリクエストをすると、プログラムを1分間スリープ状態にするにはどうすればいいですか?挑戦は
requests.get()
私のコードのどこにでも広がっています、私はループに入れられません。
を作るとき、私は何度も何度も同じサーバを呼び出すためにPythonの睡眠10のリクエスト
requests.get()
を使用していますが、私は毎分30のリクエストに制限されています。 30件のリクエストをすると、プログラムを1分間スリープ状態にするにはどうすればいいですか?挑戦は
requests.get()
私のコードのどこにでも広がっています、私はループに入れられません。
Adapter Patternを使用してリクエストをラップすることができます。このようなもの:
class RequestLimiter:
def __init__(self):
self.count = 0
def get(self, *args, **kwargs):
if self.count == 30:
time.sleep(60)
self.count = 0
return requests.get(*args, **kwargs)
else:
self.count += 1
requests.get(*args, **kwargs)
def main():
# If this is through your whole program,
# you might want to make this global- be careful with that!
r = RequestLimiter()
r.get(url, args)
要件によっては、これを変更することもできます。たとえば、コード化されているため、get
が成功するか失敗するかにかかわらず、カウントは増加します。それはあなたが望むものかもしれません。このクラスのグローバルインスタンスを作成する場合は、count
変数への同時アクセス(同時実行性を使用している場合)を心配する必要があります。
あなたのコードでは、スリープする前にリクエストの数を30に制限していますが、それは30分までしか許されません。 OPが必要とすることを本当に行うために行われた要求の間に、ある程度の意味が必要であると私は信じています。 – martineau
@martineau、OPのオリジナルの質問は、30回のリクエストごとに1分間寝る方法を尋ねました。私はこれを行う最も簡単な方法としてこのコードを投稿しました。しかし、リクエストを制限するのが最も時間効率の良い方法ではないことに私は同意します。私は時間がある場合、私はあなたのインターバルメソッドを使用して今夜別の回答を投稿しようとします。 – Ben
私はあなたのことが効率的ではなかったというわけではありませんでした。ちょうどOPがしたいことを本当にやるためには1分あたりのリクエスト数を計算する必要があります。さらに、同じ要求が行われているかどうかを確認し、それに応じて調整またはリセットする必要があるかもしれません。 – martineau
'time.sleep(60)' ... –