1

ドキュメントIDのリストがあり、Webサービスからドキュメントを取得したいとします。私はTPLの初心者で、私がgoogleに失敗したいくつかのベストプラクティスに興味があります。TPLを使用した並列I/O

PLINQのAsParallel()はソースIDリストを分割して1つ1つのパーティション内のドキュメントを1つずつ取得するので、ここでは適切ではないことを訂正しますか?

LINQのSelect()メソッドを使用してリストをTask<Document>リストに変換してからWaitAll()にする必要がありますか?

ParallelクラスとAsParallel()拡張メソッドの両方を使用しますTask<T>の下に、それらはありませんか? Task(Action<Object>, Object)過負荷に渡すのと同じように、デリゲートにローカルステートを渡すことは可能ですか?

答えて

2

AsParallel for IOを使用すると、並列度(DOP)を正確に制御できないため、危険です。あなたのIOデバイスは特定の最適なDOPを持ちますが、これはTPLが使用するものとは異なります。

また、ネットワーク機能を呼び出すとき、私はTPLがプロセッサの数よりも多くのスレッドを使用するのを見ました。これにより、ネットワークの過飽和度と準最適なスループットが得られます。タイムアウトにつながる可能性もあります。私は壊れやすい性質のためにそのようなものを生産に入れないでしょう。

スレッドの数を選択するためにTPLが使用するアルゴリズムは完全にわかりません。私は、CPUよりも多くのスレッドを追加するとスループットが向上するかどうかを検出しようとしていると思います。しかし、それはIMHOは決してCPUの数より少なく使うことはありません。イメージング64スレッドは、あなたのWebサービスを叩きつけています。

正確な並列度が必要な場合は、自分で必要な量のタスク/スレッドを作成することをお勧めします。このコードを再利用可能なヘルパー関数( "ParallelForeachWithExactDOP")に入れることができます。

私のお薦め:あなたが並行して実行するだけで、過飽和とタイムアウトの危険性がある場合、Selectを使用して一度にすべてのタスクをスポーンすることができます。タスクの数が正常な範囲にあることが分かっている場合(たとえば、最大10個のドキュメントがある場合)にのみ、これを行う必要があります。

ドキュメントを10のチャンクに分割すると、すべてのタスクが一度にスポーンされ、すべてのタスクが完了するまで待つことになります。この方法では、一度に10のタスクしか飛ばすことができません。この方法はかなり簡単です。しかし、ほとんどの場合、10個未満のタスクが実行されている場合があり、時にはまったく実行されないこともあるため、最適なスループットを提供しません。これを簡単な初心者のテクニックであると考えてください。

+0

ありがとう、非常に便利です!私の場合、サードパーティ製のAPI(Webサービス)では、get-by-idメソッドのみが公開され、ユーザーシナリオでは複数のドキュメントを取得できます。だから、おそらく、私はAsParallel()にローカルステートを渡すことができない場合は、手動のタスクのスポーンニングは私にとっては良いでしょう。 – UserControl

+0

一度に多くの文書を渡すと、発信者にタイムアウトが表示されることがあります。また、タイムアウトが表示されない場合もありますが、同じWebサービスの_other_クライアントで重大な機能停止が発生する可能性があります。 – usr

1

パラレル化のための良いターゲットであるかどうかはわかりませんが、ボトルネックは一般的なクライアントネットワーク接続になります。ここからは言えませんが、未使用の容量(ネットワークを脅かすリスク)がないか、ある文書の要求がブロックされて別の文書で作業できるようになっていない場合は、これから

ウェブサービスによる並行化は、それがgoerになります。

+0

残念ながら私はあまり選択肢がありません。私のUIはウェブアプリケーションなので、サードパーティのサーバが負荷を処理できるようにするために、バックエンドでドキュメントを1つずつリクエストするときにブラウザのタイムアウトが発生する可能性があります。 – UserControl

+0

バックエンド。うーん、どこに行くかわかります。私がこれをやる前に、私は知っておきたいことは、並行して高速になることを意味し、そうであれば、n個の "文書パック"要求に対してネットワーキングニーズを劇的に増やす能力があります。私はタイムアウトを避けるために、ある種の進行中の仕組みを見ていると思う。移動するドキュメントの数を表示し、次のアクティビティがすべて存在する場合は有効にします。 –

関連する問題