19

画像は言葉よりも多くを語るので、基本的に私が達成したいことは次のとおりです:(
一般性と単純さのために果物の類推も使用しました)
ここに画像の説明を入力

私は過去に、.Net クラスのさまざまな王様 (BackGroundWOrkers、ThreadPool、Self Made Stuff...) を使用して、この種のことを何度も行ってきました。

私はここでアドバイスを求め、これを効率的に行う方法について新鮮なアイデアを得たいと思っています.
これは高度なコンピューティング プログラムであるため、何百万もの (構造は似ていますが、内容は似ていません) データを受信して​​います。これらのデータは、コンテンツ タイプに従って処理するためにキューに入れる必要があります。したがって、処理する単一のデータごとに並列タスクを作成することは避けたいと思います (これは CPU を過負荷にし、設計が不十分です)。そのため、データの種類ごとに 1 つのスレッドのみを実行し、それを処理する専用のスレッドを用意することにしました (「プレス ジュース」メソッドは一般的であり、プレスされる果物とは無関係であることを知っています)。

アイデアや実装の提案は大歓迎です。
詳細については自由にお知らせください。

4

3 に答える 3

19

TPL DataFlowは、これに対する非常に有力な候補のようです。

ここでイントロを読んでください。

于 2013-01-08T10:32:50.627 に答える
10

果物の種類ごとに 1 つのスレッド (または一定数のスレッド) だけが必要な場合、最も簡単な解決策は、BlockingCollection果物の種類ごとに を使用することです。データ バスはこれらのコレクションに果物を届け、処理スレッドはそれらから受け取ります。しかし、これは、現時点でりんごがない場合、スレッドがブロックされ、何もしないことを意味します。

より柔軟で効率的なアプローチは、TPL データフローを使用することです。これにより、スレッドやタスクを操作するのではなく、ブロックを操作します。たとえば、スレッド C は として表すことができますTransformBlock<Apple, AppleJuice>

デフォルトでは、各ブロックは最大で 1 つのスレッドを使用しますが、より多くのスレッドを使用するように簡単に構成できます ( を設定することによりMaxDegreeOfParallelism)。また、データフロー ブロックは新しい C# 5.0 とうまく連携します。これは大きな利点となる可能性がありますasyncawait

気をつけなければならないこともあります。たとえば、TDF はデフォルトでレイテンシーではなくスループットに対して最適化されています。そのため、スレッド プールがビジー状態で、大量のオレンジが着信し、リンゴが 1 つしかない場合、すべてのオレンジが処理された後でのみリンゴが処理される可能性があります。ただし、これは、ブロックを適切に構成することによっても修正できます ( を設定することによりMaxMessagesPerTask)。

于 2013-01-08T13:48:13.287 に答える
1

「データ型ごとのワーカー スレッド」アプローチには注意が必要です。これは、実際の入力負荷が、開発者にとって便利な等価クラスに準拠することを前提としています。バナナはオレンジよりも 5 倍遅くジュースになるか知っていますか? 毎週火曜日が「りんごのお祝いの日」で、みんながいつもより多くの果物をジュースにして、そのすべてがりんごだったらどうなるでしょうか?

並行して実行することは、ドメインではなくパフォーマンスに関するものです。ドメインの後にモデル化するのではなく、最小の平均サイクル時間を提供するようにモデル化してください。

于 2013-01-08T14:24:07.490 に答える