gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:37:21 28 4
gpt4 key购买 nike

我要处理 List 中的一百万个元素。
将它们粗暴地放入 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 使用率,并避免此处理对其造成过多负载。

最佳答案

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

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

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

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

关于c# - 按顺序拆分 Parallel.Foreach 循环上的负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9362573/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com