私が質問したのはhereです。なぜThread.Runを使用してプロセスを開始すると、私が期待したほど多くの同時要求が実行されなかったのですか?rabbitmqメッセージの処理concurrenrtly
この質問の背後にある理由は、私がrabbitmqキューからメッセージを引き出して同時に最大数の同時メッセージを処理できるクラスを作成しようとしていたためです。
これを行うには、私はEventingBasicConsumer
クラスのReceived
ハンドラーで次のようにしました。
async void Handle(EventArgs e)
{
await _semaphore.WaitAsync();
var thread = new Thread(() =>
{
Process(e);
_semaphore.Release();
_channel.BasicAck(....);
});
thread.Start();
}
ただし、前の投稿のコメントは、CPUの動作をしない限りスレッドを開始しないというものでした。
上記のハンドラは、作業がCPUバインド、ネットワーク、ディスクまたはそれ以外であるかどうかを認識しません。 (Process
は抽象メソッドです)。
ここでもスレッドまたはタスクを開始する必要があると思いますが、そうでなければProcess
メソッドはrabbitmqスレッドをブロックし、イベントハンドラは終了するまで再度呼び出されません。だから私は一度に一つの方法しか扱えない。
新しいThread
はここから始まります。大丈夫ですか?もともと私はTask.Run
を使用していましたが、これは必要な数の労働者を生産しませんでした。他の記事を参照してください。
FYI。同時スレッドの数は、セマフォ上にInitialCount
を設定することによって制限されます。