按顺序拆分Parallel.Foreach循环上的负载

时间:2012-02-20 14:15:14

标签: c# parallel-processing

我在列表中有一百万个要处理的元素 粗略地将它们放入 Parallel.ForEach 只会使CPU饱和 相反,我将元素主列表拆分为多个部分,并将子列表放入并行循环中。

List<Element> MasterList = new List<Element>();
Populate(MasterList); // puts a Million elements into list;

//Split Master List into 100 Lists of 10.0000 elements each
List<List<Element>> ListOfSubLists = Split(MasterList,100);

foreach (List<Element> EL in ListOfSubLists )
{
   Parallel.ForEach(EL, E =>
   {
     // Do Stuff
   }

  //wait for all parallel iterations to end before continuing   
}    

在继续上循环的下一次迭代之前,等待所有并行迭代结束的最佳方法是什么?

编辑:
正如一些答案所说,“使CPU饱和”并不是一个准确的表达方式。
实际上我只想限制CPU使用率,并避免来自此处理的过度负载。

2 个答案:

答案 0 :(得分:4)

Parallel.ForEach不会使CPU饱和;它使用一些智能来决定同时运行多少个并行线程,最多63个。

请参阅:Does Parallel.ForEach limits the number of active threads?

如果需要,您还可以设置最大并行度,方法是向ParallelOptions提供new ParallelOptions { MaxDegreeOfParallelism = 5 } Parallel.ForEach作为第二个参数。

作为最后一点,Parallel.ForEach会阻塞,直到所有迭代完成。因此,您编写的代码可以正常工作。您无需等待迭代完成。

答案 1 :(得分:2)

你是什么意思“饱和CPU”

您仍然可以通过向ParallelOptions提供并行的foreach循环来限制它 其中一个属性是MaxDegreesOfParallelism

这将允许您返回单个集合,例如

Parallel.ForEach(
     collection,
     new ParallelOptions { MaxDegreeOfParallelism = 5},
     E => { DoStuff(E) }
);