代码之家  ›  专栏  ›  技术社区  ›  codingpirate

AsParallel()的最大并行度

  •  38
  • codingpirate  · 技术社区  · 10 年前

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

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

    但在执行PLINQ时,如:

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

    我找不到设置的方法 MaxDegreeOfParallelism 。我也在网上查了一下,但什么也没找到。有人找到了解决办法吗?感谢任何帮助。

    3 回复  |  直到 7 年前
        1
  •  65
  •   Yuval Itzchakov    9 年前

    您可以使用 ParallelEnumerable.WithDegreeOfParallelism :

    设置要在查询中使用的并行度。学位 并行性是同时执行的任务的最大数量 将用于处理查询。

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

    编辑:

    @斯维克在 ParallelOptions.MaxDegreeOfParallelism vs PLINQ’s WithDegreeOfParallelism 这强调了两者之间的区别:

    并行工作使用我们称为复制任务的隐藏概念。其概念是,一个循环将以一个任务开始处理该循环,但如果有更多线程可用于辅助处理,则将创建其他任务以在这些线程上运行。这使得资源消耗最小化。 考虑到这一点,如果说ParallelOptions支持DegreeOfParallelism的规范是不准确的,因为它实际上是一个最大的度 :循环以1度开始,并且可以在资源可用时达到指定的最大值。

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

        2
  •  9
  •   Sriram Sakthivel    10 年前

    是的,你当然可以做到。你只是用 WithDegreeOfParallelism 延伸法

    yourSequence.AsParallel()
        .WithDegreeOfParallelism(5)//Whatever number as you like
        .Where(...);
    
        3
  •  0
  •   letscode    9 年前
    <IEnumerable>.AsParallel()
    .WithDegreeOfParallelism(n)
    .Where(x=>)