2012-09-11 4 views
7

私は口座番号のリストを持っています。 Foreach口座番号ProcessAccountメソッドを呼び出す必要があります。約15万件のアカウントが処理される必要があり、各アカウントは処理に0.5〜2秒かかります。CのNスレッドでキューを処理する簡単な方法は?

何とかスレッドを設定したいので、たとえば4つのアカウントを同時に処理することができます。

これに使用できるシンプルなパターンはありますか?

私ができるようにしたいのは、最初の4つのアカウントを処理する4つのスレッドを開始し、すべてのアカウントが処理されるまで次のアカウントで別のスレッドを開始することです。

+0

を - これが最も可能性の高いコンソールアプリケーションから実行されます。 – AWeim

+4

'ProcessAccount'の依存関係は何ですか?これは計算上の操作かI/O境界操作ですか? –

+1

ブライアンはそこに良い点があります、あなたはリストに言及して、そのリストです?ディスクからデータを読み込む必要がある場合や、リモートサービスなどを呼び出す必要がある場合は、必要なすべてのデータをメモリに格納しておく必要があります。まず、ボトルネックを特定する必要があります。 – gjvdkamp

答えて

12

これは、TPL(Task Parallel Library)で処理するのが簡単です。これは、TPLが4つの未満の同時スレッドを実行することを決定する可能性があることを

ParallelOptions options = new ParallelOptions() { MaxDegreeOfParallelism = 4 }; 
Parallel.ForEach(accounts, options, a => 
{ 
    ProcessAccount(a); 
}); 

http://msdn.microsoft.com/en-us/library/dd782721.aspx

ノートのようなものに見えるだろうが、指定されたオプションに基づいて、4つ以上を実行しません。たとえば、提供されたlamda(ProcessAccountを呼び出す)がCPUにバインドされており、システムに4つ未満のCPUコアがあると判断した場合などです。一般に、特に.NET 4.5では、TPLは使用するスレッドの数を非常に適切に判断します。

コメントに@Servyが書いているように、コードを4つのスレッドに制限する非常に特別な理由がない限り、TPLが単独で使用するスレッドの数を並べ替えることをお勧めします。そうすれば、2018年に同じコードが128コアプロセッサ上で実行されている場合、他のものに移行しても、128コアをすべて自由に使用できます)。

+1

消費したリソースを意図的に制限して他の人に利用可能にする場合を除き、通常は必要以上に指定しないことをお勧めします。あなたが考えることを行うために図書館に与える自由度が高ければ高いほど、それはより良く実行されます。 – Servy

+0

@セイビー:それは非常に良い点です。 100%同意する。 –

1

使用PLINQ:

var accounts = //some 150,000 account numbers 
accounts.AsParallel().ForAll(ProcessAccount); 

または、他の引数が必要な場合は、ラムダ式を使用:FYI

accounts.AsParallel().ForAll(account => ProcessAccount(account, argument2, argument3)); 
+0

これは最大スレッド数を4に制限しません。 –

+1

@EricJ。いいえ、あなたは正しい、そうではありません。私の経験では、PLinqは私の助けを借りずに自分自身を抑制する十分な仕事をしていますが、パフォーマンスに非常に敏感な地域ではありません。 – phoog

+1

@EricJ。私の推測では、OPはスレッドプールの概念に精通しておらず(静的な数のスレッドで自分自身を作る必要があると予想されます)、4スレッドに制限するビジネス要件はありません。 – Servy

関連する問題