按顺序拆分Parallel.Foreach循环上的负载
我在列表中有一百万个要处理的元素。
将它们粗略地放入Parallel.ForEach只会使CPU饱和。
相反,我将元素主列表拆分为多个部分,并将子列表放入并行循环中。
List MasterList = new List(); Populate(MasterList); // puts a Million elements into list; //Split Master List into 100 Lists of 10.0000 elements each List<List> ListOfSubLists = Split(MasterList,100); foreach (List EL in ListOfSubLists ) { Parallel.ForEach(EL, E => { // Do Stuff } //wait for all parallel iterations to end before continuing }
在继续上一次循环的上一次迭代之前,等待所有并行迭代结束的最佳方法是什么?
编辑:
正如一些答案所说,“使CPU饱和”并不是一个准确的表达。
实际上我只想限制CPU使用率,并避免来自此处理的过度负载。
Parallel.ForEach
不会使CPU饱和; 它使用一些智能来决定同时运行多少并行线程,最多为63。
请参阅: Parallel.ForEach是否限制活动线程的数量?
如果需要,还可以通过提供ParallelOptions
如new ParallelOptions { MaxDegreeOfParallelism = 5 }
作为Parallel.ForEach
的第二个参数)来设置最大Parallel.ForEach
。
最后一点, Parallel.ForEach
阻塞,直到所有迭代完成。 因此,您编写的代码可以正常工作。 您无需等待迭代完成。
你是什么意思“饱和CPU”
你仍然可以通过为ParallelOptions
一个并行的foreach循环,其中一个属性是MaxDegreesOfParallelism
这将允许您回到您的单个集合,例如
Parallel.ForEach( collection, new ParallelOptions { MaxDegreeOfParallelism = 5}, E => { DoStuff(E) } );