【问题标题】:Max Degree of Parallelism for AsParallel()AsParallel() 的最大并行度
【发布时间】:2014-10-07 01:29:52
【问题描述】:

在使用Parallel.ForEach 时,我们可以选择定义并行选项并设置最大并行度,例如:

Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > {
    // Do Work
})

但是在做 PLINQ 的时候:

Tabel.AsEnumberable()
     .AsParallel()
     .Where(//Logic)

我找不到设置MaxDegreeOfParallelism 的方法。我也在网上查了一下,但没有找到任何东西。有人找到解决方法吗?任何帮助表示赞赏。

【问题讨论】:

    标签: c# .net task-parallel-library parallel.foreach plinq


    【解决方案1】:

    你可以使用ParallelEnumerable.WithDegreeOfParallelism:

    设置要在查询中使用的并行度。程度 并行度是并发执行任务的最大数量 将用于处理查询。

    var result = Tabel.AsEnumberable()
                      .AsParallel()
                      .WithDegreeOfParallelism(number)
                      .Where(/* predicate */);
    

    编辑:

    @svick 在ParallelOptions.MaxDegreeOfParallelism vs PLINQ’s WithDegreeOfParallelism 上提供了出色的表现,强调了两者之间的区别:

    并行工作使用我们称为复制任务的隐蔽概念。这个概念是一个循环将从一个处理循环的任务开始,但如果有更多线程可用于协助处理,则会创建额外的任务以在这些线程上运行。这使得资源消耗最小化。 鉴于此,说 ParallelOptions 启用 DegreeOfParallelism 的规范是不准确的,因为它实际上是一个最大度数:循环从 1 度数开始,并且可以达到任何最大值这是在资源可用时指定的。

    PLINQ 不同。 PLINQ 中一些重要的标准查询运算符需要在查询处理中涉及的线程之间进行通信,包括一些依赖屏障来使线程能够以锁步方式运行的运算符。 PLINQ 设计要求主动参与特定数量的线程以使查询取得任何进展。因此,当您为 PLINQ 指定 DegreeOfParallelism 时,您指定的是将涉及的实际线程数,而不仅仅是最大值。

    【讨论】:

    • 您可能还想阅读ParallelOptions.MaxDegreeOfParallelism vs PLINQ’s WithDegreeOfParallelism 了解两者之间的区别。
    • 这个答案似乎与this one不一致
    • @crokusek 我不确定这个答案是从哪里得到的,但它似乎没有得到任何官方文档的支持。另外,我不确定他们从哪里得到第一个 IO 操作会阻塞所有其他操作的概念。听起来很奇怪。
    • 不幸的是,我看到的行为与另一个答案一致——即在 4 核机器上指定 WithDegreeOfParallelism(32) 仍然硬限制为 8。有没有人证明在 N 个线程 >> 2*core 的地方直接使用了该值?
    • 来自我做的一个小测试。实际线程数似乎不等于 DegreeOfParallelism 。我分配了 DegreeOfParallelism = 100 ,并运行了一个小程序,为每个“任务”记录它的线程 ID——实际上只使用了 9 个线程。我在 .Net 4.5.1 中运行
    【解决方案2】:

    是的,您当然可以这样做。你只需使用WithDegreeOfParallelism 扩展方法

    yourSequence.AsParallel()
        .WithDegreeOfParallelism(5)//Whatever number as you like
        .Where(...);
    

    【讨论】:

      【解决方案3】:
      <IEnumerable>.AsParallel()
      .WithDegreeOfParallelism(n)
      .Where(x=>)
      

      【讨论】:

      • @codingpirate 只是想知道,将近一年后,您将我的答案取消标记为已接受具有相同答案的答案?有什么特别的原因吗?
      • @YuvalItzchakov - 为了关闭线程,我接受了答案。话虽如此,我也将您的解释作为公认的答案
      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多