4

Webサイトからデータを取得する必要があります。アクセスする必要のあるリンクが1,000以上あり、以前はスレッドごとに10のリンクを分割し、10をプルするたびに100のスレッドを開始していました。いくつかのテストケースの後、コンテンツを取得する時間を最小限に抑えるには、100のスレッドが最適なカウントでした。すべてのリンク。

.NET 4.0は、箱から出してすぐにマルチスレッドをより適切にサポートすることに気付きましたが、これはコアの数に基づいて行われ、私の場合は十分なスレッドを生成しません。私が求めているのは、1,000リンクのプルを最適化するための最良の方法は何かということだと思います。拡張機能を使用.ForEachして、Parallel生成されるスレッドの量を制御する必要がありますか、それとも、作業を開始して分割するスレッドの数を拡張機能に指示する方法を見つける必要がありますか?

私は以前に一緒に仕事をしたことがないParallelので、おそらく私のアプローチは間違っているかもしれません。

4

4 に答える 4

5

Parallel.ForEachのMaxDegreeOfParallelismプロパティを使用 して、生成されるスレッドの数を制御できます。

コードスニペットは次のとおりです-

ParallelOptions opt = new ParallelOptions();
opt.MaxDegreeOfParallelism = 5;

Parallel.ForEach(Directory.GetDirectories(Constants.RootFolder), opt, MyMethod);
于 2013-10-18T09:13:23.310 に答える
4

一般に、Parallel.ForEach()スレッド数の最適化には非常に優れています。システム内のコアの数を考慮しますが、スレッドが実行していること(CPUバウンド、IOバウンド、メソッドの実行時間など)も考慮します。

並列化の最大度を制御できますが、より多くのスレッドを強制的に使用するメカニズムはありません。

ベンチマークが正しく、公正な方法で比較できることを確認してください(たとえば、同じWebサイト、測定を開始する前にウォームアップ期間を考慮し、応答時間の変動が非常に高いスクレイピングWebサイトになる可能性があるため、多くの実行を行います)。注意深く測定した後でも、独自のスレッデッドコードの方が高速である場合は、特定のケースに合わせて.NETよりも最適化されていると判断し、独自のコードを使用することができます。

于 2013-02-08T16:53:45.877 に答える
3

チェックする価値のあるものは、TPLデータフローライブラリです。

MSDNのDataFlow 。

Parallel.ForEachでのネスティング待機を参照してください

Parallel.ForEach()の背後にある全体的な考え方は、一連のスレッドがあり、各プロセスがコレクションの一部であるということです。お気づきのように、これはasync-awaitでは機能しません。async-awaitでは、非同期呼び出しの期間中、スレッドを解放します。

また、ウォークスルー「データフローパイプラインの作成」では、複数のWebページのダウンロードを具体的に設定して処理します。TPL Dataflowは、実際にはそのシナリオ向けに設計されています。

于 2013-02-08T17:04:16.387 に答える
0

あなたのコードとコレクションがどのように定義されているかを見ずに言うのは難しいですが、私はそれ Parallel.Invokeが最も柔軟であることがわかりました。msdnを試してみますか?...あなたが使用しようとしているように聞こえますParallel.For Method (Int32, Int32, Action<Int32, ParallelLoopState>)

于 2013-02-08T16:59:30.233 に答える