为什么PLINQ只使用两个线程?

rip*_*234 7 .net c# plinq

假设我有一个IO绑定任务.我使用WithDegreeOfParallelism = 10和WithExecution = ForceParallelism模式,但查询仍然只使用两个线程.为什么?

我知道PLINQ通常会选择一个与我的核心数相等的并行度,但为什么它忽略了我对更高并行性的特定要求呢?

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;
}
Run Code Online (Sandbox Code Playgroud)

Ror*_*ory 9

PLINQ试图找到最佳线程数来执行你希望它尽快做,如果你只对你的CPU有2个核心的东西,这个数字是最有可能2.如果你有一个四核,你会更可能会看到4个线程出现,但在双核机器上创建4个线程并不能真正提高性能,因为只有2个线程可以同时处于活动状态.

此外,对于基于IO的操作,任何额外的线程可能只会阻塞执行的第一个IO操作.

  • 没有真正回答我的问题 - 为什么它选择使用两个线程,即使我特别要求一定程度的并行= 10?(更新的问题) (4认同)
  • @ ripper234:MSDN上的"PLINQ简介"文章特别建议提高I/O绑定任务的并行度:"如果查询正在执行大量非计算绑定工作,例如File I/O,指定一个大于机器上核心数的并行度可能是有益的".但我认为PLINQ本身做出了最终的决定,如果它决定(正确或错误地)增加并行性将无助于性能,那么它就不会这样做!http://msdn.microsoft.com/en-us/library/dd997425%28VS.100%29.aspx (4认同)
  • @ ripper234:来自MSDN文档:"并行度是**最大**将用于处理查询的并发执行任务的数量".`WithDegreeOfParallelism`只是一个提示,即PLINQ应该使用*不超过*n*个线程.http://msdn.microsoft.com/en-us/library/dd383719%28VS.100%29.aspx (3认同)
  • 那么......没有办法有效地将PLINQ用于IO绑定任务? (3认同)