Angenommen, ich habe eine E/A-gebundene Aufgabe. Ich verwende WithDegreeOfParallelism = 10 und WithExecution = ForceParallelism-Modus, aber die Abfrage verwendet immer noch nur zwei Threads. Warum?Warum verwendet PLINQ nur zwei Threads?
Ich verstehe PLINQ wird in der Regel einen Grad der Parallelität gleich meiner Kernzahl wählen, aber warum ignoriert es meine spezifische Anfrage für höhere Parallelität?
static void Main(string[] args)
{
TestParallel(0.UpTo(8));
}
private static void TestParallel(IEnumerable<int> input)
{
var timer = new Stopwatch();
timer.Start();
var size = input.Count();
if (input.AsParallel().
WithDegreeOfParallelism(10).
WithExecutionMode(ParallelExecutionMode.ForceParallelism).
Where(IsOdd).Count() != size/2)
throw new Exception("Failed to count the odds");
timer.Stop();
Console.WriteLine("Tested " + size + " numbers in " + timer.Elapsed.TotalSeconds + " seconds");
}
private static bool IsOdd(int n)
{
Thread.Sleep(1000);
return n%2 == 1;
}
Wie viele Prozessoren/Kerne haben Sie? – LukeH
Zwei. Aber ich habe speziell den Grad der Parallelität als 10 angegeben. – ripper234
Wenn Sie eine E/A-gebundene Aufgabe haben und sie parallel auf mehreren Threads ausführen, verbessert sich die Geschwindigkeit dann war es wahrscheinlich nicht wirklich I/O-gebunden an erster Stelle, es wurde nur schlecht geschrieben (z. B. sync liest statt async). –