0


BlockingQueue を使用して一般的なプロデューサー/コンシューマーを構築しようとしています。
すべてのコンピューター リソースを消費せずに、できるだけマルチ スレッド化または並列化したいと考えています。
プロデューサーが 1 つあるとします。データを消費するときに、スレッドとしてコンシューマーを使用するか、タスクを使用して 1 つのコンシューマーを使用する方がよいでしょうか?

while(true)  
{
   queue.TryTake(...) { Task.Factory.StartNew(...); }
}

また

Thread t = new Thread(Consumer.Start);
4

2 に答える 2

0

コンピューターのリソースが心配な場合の解決策は、すべてがタスク キューを監視するワーカー スレッドのプールを実行することです。タスクがキューに置かれ、ワーカー スレッドが解放されるとすぐに、キューからタスクを読み取り、作業を開始します。 ?

これは非常に簡単に設定できるはずです。

//ダニエル

于 2011-04-26T09:37:30.277 に答える
0

組み合わせかも。

最初の提案には、キューが十分にいっぱいになると、多くのタスクを開始するという問題があります。

2番目のものは1つのスレッドのみを使用します(ここでの意味はそれだと思います)。

おそらく、N 個のコンシューマーを開始し、N 用に何らかの戦略を立てる必要があります。これは、作業量、I/O の使用などに大きく依存します。

考えられる戦略は

  • N = コア数 (- 1)
  • Queue.Count > M の場合に新しい Consumer を開始する

また、スレッドの代わりにタスク (LongRunning オプション付き) を使用することもできます。

于 2011-04-26T09:38:12.917 に答える