x
継続的に生成したいリクエスト/秒の目標があるとします。私の目標は、これらのリクエストをほぼ同じ間隔で開始することです。単に x リクエストを生成してから 1 秒が経過するまで待って、すべてを何度も繰り返すのではありません。これらのリクエストについては何も仮定していません。一部のリクエストは他のリクエストよりもはるかに時間がかかる可能性があります。そのため、スケジューラ スレッドはリクエストを実行せず (またはリクエストが完了するのを待機しません)、十分なサイズのスレッド プールにリクエストを渡します。
x
が数百以下の範囲にある場合は、.net のTimer
s またはThread.Sleep
を使用して実際の経過時間を確認することでうまくいくかもしれませんStopwatch
。
しかし、数千または数万に行きたい場合は、高解像度タイマーを試して、ほぼ同じ間隔アプローチを維持することができます. しかし、これは (一般的な OS 上のほとんどのプログラミング環境では) スピン待機などを伴うある程度のハンドコーディングを意味するため、このルートを取る価値があるかどうかはわかりません。
最初のアプローチを拡張して、代わりに Timer を使用してスリープし、y
Timer イベントごとにリクエストを実行し、これを実行して達成された 1 秒あたりの実際のリクエストを監視し、y
実行時に微調整することができます。その効果は、「すべての x リクエストを送信し、開始から 1 秒経過するまで待機する」ことと、「次のリクエストを開始する前にほぼ正確に 1/x 秒待機すること」の間のどこかにあります。
後者は良い妥協案のように思えますが、時間の経過とともにリクエストをある程度均等に分散させながら、より簡単な方法はありますか? これはさまざまな人によって何百回も実装されてきたに違いありませんが、この問題に関する適切な参考文献が見つかりません。
では、これを実装する最も簡単な方法は何ですか?