回答: import threading import time class TokenBucketRateLimiter: def __init__(self, capacity, refill_rate): """ トークンバケット型レートリミッターを初期化します。 :param capacity: バケットが保持できるトークンの最大数。 :param refill_rate: 1秒あたりにバケットへ追加されるトークン数。 """ self.capacity = capacity self.refill_rate = refill_rate self._tokens = capacity # 満杯のバケットから開始 self._last_refill_time = time.monotonic() self._lock = threading.Lock() def _refill(self): """ 前回の補充からの経過時間...
全文を表示 ▼
回答: import threading import time class TokenBucketRateLimiter: def __init__(self, capacity, refill_rate): """ トークンバケット型レートリミッターを初期化します。 :param capacity: バケットが保持できるトークンの最大数。 :param refill_rate: 1秒あたりにバケットへ追加されるトークン数。 """ self.capacity = capacity self.refill_rate = refill_rate self._tokens = capacity # 満杯のバケットから開始 self._last_refill_time = time.monotonic() self._lock = threading.Lock() def _refill(self): """ 前回の補充からの経過時間に基づいてバケットを補充します。 このメソッドは、ロックを保持した状態で呼び出さなければなりません。 """ now = time.monotonic() elapsed = now - self._last_refill_time tokens_to_add = elapsed * self.refill_rate self._tokens = min(self.capacity, self._tokens + tokens_to_add) self._last_refill_time = now def consume(self, tokens): """ バケットから指定された数のトークンを消費しようと試みます。 :param tokens: 消費するトークン数。 :return: トークンの消費に成功した場合はTrue、そうでない場合はFalse。 """ if tokens <= 0: raise ValueError("消費するトークン数は正でなければなりません。") if tokens > self.capacity: # 満杯のバケットであっても決して満たせない return False with self._lock: self._refill() if self._tokens >= tokens: self._tokens -= tokens return True return False 日本語のみの出力ルール: - 中国語(簡体字または繁体字)を出力しないでください。自然な日本語のみに翻訳してください。 - テキスト全体を最初から最後まで適切に日本語に翻訳してください。
判定
勝利票
3 / 3
平均スコア
総合点
総評
回答Aは、トークンバケットレートリミッターの非常に正確でよく構造化された実装を提供しています。コード品質は素晴らしく、明確なドキュメンテーション文字列とPythonの慣習に従っており、スレッドセーフティを正しく実装し、指定されたエッジケースを明示的に処理しているため、堅牢で保守性の高いソリューションとなっています。
採点詳細を表示 ▼
正確さ
重み 35%トークンの補充と消費のアルゴリズムは正しく実装されています。容量制限は適切に強制され、時間ベースの補充ロジックは健全です。
完全性
重み 20%回答は、指定されたすべてのメソッド(`__init__`、`consume`)と必要なインポートを含む、完全なクラス実装を提供しています。
コード品質
重み 20%コードはクリーンで読みやすく、標準的なPythonの慣習に従っています。公開メソッドには優れたドキュメンテーション文字列が含まれており、プライベートなrefillメソッドには明確なコメントがあり、保守性が大幅に向上しています。
実用性
重み 15%実装では`threading.Lock`を使用してスレッドセーフティを確保しており、並行環境に適しています。実用的に健全なソリューションです。
指示遵守
重み 10%このソリューションは、プロンプトの「堅牢性とエッジケース」セクションで言及されているすべてエッジケースを明示的に処理しています。`tokens`が非正の場合に`ValueError`を発生させ、`tokens`が`capacity`を超える場合は直ちに`False`を返します。初期状態も正しく設定されています。
総合点
総評
モノトニック時間、分数での補充、容量の上限設定、補充と消費の適切なロック処理を備えた、正しいトークンバケットリミッターを実装しています。また、容量を超えるリクエストに対する重要なエッジケースもFalseを返すことで処理しています。軽微な欠点:トークンが0以下の場合は例外が発生します(ポリシー依存であり、0を何もしないTrueとして扱うことを好む場合もあります)。また、容量/補充率の入力値検証を行いません。
採点詳細を表示 ▼
正確さ
重み 35%経過したモノトニック時間に基づいた正しいトークンバケットの補充、容量までの上限設定、ロック下での補充+消費の原子的な実行を行います。分数トークンを適切に使用しています。
完全性
重み 20%インポート、内部の補充ヘルパー、消費メソッドを含む完全なクラスを提供しており、明示的なトークン>容量の処理も含まれています。容量/補充率の値の検証が欠けています。
コード品質
重み 20%読みやすく、PEP8に準拠しており、動作やロックに関する期待値を説明するドキュメンテーション文字列が付いています。構造は明快です。
実用性
重み 15%一般的な用途に実用的です。不可能なほど大きなリクエストに対する即時のFalse返却は役立ちます。トークン<=0での例外発生は、一部の統合では不便な場合があります。容量/補充率のパラメータ検証がありません。
指示遵守
重み 10%要件を満たしています:スレッドセーフ、外部状態ライブラリ不使用、正しいメソッドと動作、必要なインポートが含まれています。
総合点
総評
回答Aは、トークンバケットレートリミッターの正しく、完全で、十分に文書化された実装を提供します。スレッディング.Lockを使用して適切なスレッドセーフティを備えたアルゴリズムを正しく実装しており、容量以上のトークンを消費する(Falseを返す)場合や、ゼロまたは負のトークンを消費する場合(ValueErrorを発生させる)などのエッジケースを処理します。コードには、各メソッドの目的とパラメータを説明する明確なドキュメンテーション文字列が含まれています。信頼性の高い時間追跡のためにtime.monotonic()を使用しています。コードはクリーンで読みやすく、Pythonの規約によく従っています。
採点詳細を表示 ▼
正確さ
重み 35%適切なリフィル計算、容量の制限、およびアトミックな消費操作により、トークンバケットアルゴリズムを正しく実装しています。容量以上のトークンを要求するエッジケースを早期にFalseを返すことで処理します。正でないトークン要求に対してValueErrorを発生させます。
完全性
重み 20%必要な__init__、consume、およびスレッドセーフティをカバーしています。エッジケースを処理します:ゼロ/負のトークン(ValueError)、容量を超えるトークン(Falseを返す)。満杯のバケットから開始します。必要なすべてのインポートが含まれています。
コード品質
重み 20%クラスと各メソッドの明確なドキュメンテーション文字列により、十分に文書化されています。パラメータの説明が提供されています。コードはクリーンで読みやすく、PEP 8の規約に従っています。プライベートな_refillメソッドは、ロックが保持されている必要があることが明確に示されています。
実用性
重み 15%本番環境で使用できる状態です。容量を超えるトークンに対する早期リターンは実用的な最適化です。無効な入力に対するValueErrorはデバッグに役立ちます。信頼性の高いタイミングのためにtime.monotonic()を使用しています。
指示遵守
重み 10%すべての指示に従っています:指定された名前のクラス、容量とリフィルレートを持つ__init__、True/Falseを返すconsumeメソッド、threading.Lockによるスレッドセーフティを実装し、必要なインポートを含んでいます。要求されたとおりに完全なクラス実装を提供します。