1秒あたりのメソッド実行数を制限する

タスク :1秒あたりの所定数の操作を実行する機能を開発する。

要件


その結果、trueまたはfalse(実行許可)を返す関数(当然、個別のクラスの一部として)を取得しました。

一般的な原則は次のとおりです。 日時のDateTimeフィンガープリントのコレクションがあります(コメントでは、ストップウォッチを使用する方が賢明であると示唆されています)。 それを超える場合はfalseが返され、そうでない場合は現在の時刻のキャストがコレクションに追加され、真実が返されます。

最初は、シート(リスト<>)に基づいてすべてを行いましたが、シートには動的なデータセットがあります。つまり、必要に応じて、新しい要素を追加するときに展開されます。 また、削除する必要もあります。 そこで、私は特定のサイズのコレクションを使用することにしました。 したがって、私は配列を支持してシートを放棄することにしました。 その結果、配列に基づく循環コレクションの機能が得られたため、最終的に循環コレクションを作成しました。

その結果、円形のコレクションに基づいて、特定のサイズの日付プリントのプールができました。 プールクラスには、日付スタンプと次のアイテムへのリンクがある現在のアイテムが含まれています。 最初は、すべての日付にデフォルト値があります。

許可を要求すると、現在の要素から次の要素が取得され、その日付に1秒が追加されます。 日付が現在の日付よりも大きい場合、プールにスペースがなく、リクエストはfalseを返します。 それ以外の場合、次の要素が現在の要素として設定され、日付キャストが新しい現在の要素に設定され、trueが返されます。

次にスレッドについて。 許可機能にロックをかけることほど良いものは思いつきません。

以上です。

テストのために、特定の数のスレッドで特定の数のリクエストを実行するメソッドを作成しました。 以下のパラメーターで起動しました。 1秒あたりの操作数は6、スレッド数は4、リクエスト数は50です。

結果は次のとおりです。



githubへのリンク

画面から、コードが正しく機能したことがわかります。

Source: https://habr.com/ru/post/J331612/


All Articles