答えは、コアの数にかかわらず、並列動作全体の上限であるということです。
したがって、IOまたはロックを待機しているためにCPUを使用しなくても、余分なタスクは並列で実行されません。指定した最大値だけが実行されます。
これを調べるために、私はこのテストコードを書きました。そこには、より多くのスレッドを使用するようにTPLを刺激する人工的なロックがあります。あなたのコードがIOまたはデータベースを待っているときも同じことが起こります。
class Program
{
static void Main(string[] args)
{
var locker = new Object();
int count = 0;
Parallel.For
(0
, 1000
, new ParallelOptions { MaxDegreeOfParallelism = 2 }
, (i) =>
{
Interlocked.Increment(ref count);
lock (locker)
{
Console.WriteLine("Number of active threads:" + count);
Thread.Sleep(10);
}
Interlocked.Decrement(ref count);
}
);
}
}
MaxDegreeOfParallelismを指定しないと、コンソールログには同時に最大約8つのタスクが実行されていることが示されます。このように:
Number of active threads:6
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:6
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
Number of active threads:7
時間がたつにつれて増加し、最後に8を同時に実行しようとしています。私はいくつかの任意の値に制限した場合
は(たとえば2)、Iは
Number of active threads:2
Number of active threads:1
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
Number of active threads:2
ああを取得し、これはquadcoreマシン上にあります。
私のロジックには待ち時間やIOがなく、ただSQLを更新します。はいSQLは独自のものかもしれませんが、大部分はSQLが終了するのを待っています。使用されているアクティブなスレッドのデフォルト最大数は何ですか? –
コアあたりのデフォルトは2ですが、コードがCPUを使用していない場合、TPLはこれを発生させることができます。ほとんどのデータベースにはIOがいくらか含まれています。 –
6コアマシンの負荷が高い場合は、1つまたは2つのスレッドしか使用しません。軽くロードされている場合は、最大12になります。既存のシステム負荷を考慮に入れるほどにインテリジェントです。 – Contango