[解決済み] 良いレートリミッターアルゴリズムとは?
2022-04-22 23:14:02
質問
疑似コード、もしくはPythonがあればより良いのですが。 私は Python IRC ボットにレート制限キューを実装しようとしています。部分的には動作しますが、誰かが制限より少ないメッセージをトリガーし(例えば、レート制限は8秒間に5メッセージで、その人は4しかトリガーしない)、次のトリガーが8秒を超えた場合(例えば、16秒後)、ボットはメッセージを送信しますが、キューがいっぱいになり、8秒が経過したので必要ないにもかかわらずボットは8秒待機します。
解決するには?
ここで 最もシンプルなアルゴリズム もし、メッセージがあまりに早く到着したときに、単にメッセージを削除したい場合(キューに入れるのではなく、キューが恣意的に大きくなる可能性があるため、理にかなっています)。
rate = 5.0; // unit: messages
per = 8.0; // unit: seconds
allowance = rate; // unit: messages
last_check = now(); // floating-point, e.g. usec accuracy. Unit: seconds
when (message_received):
current = now();
time_passed = current - last_check;
last_check = current;
allowance += time_passed * (rate / per);
if (allowance > rate):
allowance = rate; // throttle
if (allowance < 1.0):
discard_message();
else:
forward_message();
allowance -= 1.0;
このソリューションには、データ構造、タイマーなどはなく、きれいに動作します :) これを見るために、'allowance' は最大で毎秒5/8ユニット、つまり8秒間に最大5ユニットの速度で成長する。転送されたメッセージは1個ずつ減算されるので、8秒間に5個以上のメッセージを送信することはできません。
なお
rate
は整数でなければなりません。つまり、小数点以下が0でないものでなければ、アルゴリズムは正しく動作しません(実際のレートは
rate/per
). 例
rate=0.5; per=1.0;
は機能しません。
allowance
は1.0まで成長することはないでしょう。しかし
rate=1.0; per=2.0;
は正常に動作します。
関連
-
Pythonの非常に便利な2つのデコレーターを解説
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] リストとタプルの違いは何ですか?
-
[解決済み] Hi/Loアルゴリズムとは?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】アルゴリズムの時間複雑性を求めるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonによるjieba分割ライブラリ
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み] データ型が理解できない
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] N秒間にM回のリクエストに対してメソッド呼び出しをスロットルする