gpt4 book ai didi

c# - 如何并行化 IEnumerable 的 IEnumerable?

转载 作者:行者123 更新时间:2023-11-30 15:54:25 25 4
gpt4 key购买 nike

我有一个变量:

var contexts 其中设置后是一个 IEnumerable。此对象的属性之一也是 IEnumerable 我有:

Parallel.ForEach(contexts.AsParallel(), (context) =>
{
Parallel.ForEach(context, (child) =>
{

});
});

但是 VS 提示第二个 ForEach

最佳答案

您试图在此处应用过多的嵌套并行性。

Parallel.ForEach(   <-- #1
contexts.AsParallel(), <-- #2
(context) => {
Parallel.ForEach( <- #3

假设这是 CPU 密集型工作,您真的不想这样做。这可能会创建太多需要映射到线程的任务,这会导致大量适得其反的上下文切换。

假设最外层循环中有足够数量的项目且体积相等,那么最好只在外层循环处保持并行度:

Parallel.ForEach(
contexts,
context => { ...

(并且如果外层循环中的项目数量不足以让所有核心保持忙碌,或者如果内部IEnumerable中的项目分散不均匀,将导致任务完成不均等次,然后考虑使用@TheGeneral 的使用contexts.SelectMany(c => c) 的想法,即 outer.SelectMany(o => o.Inner) 的形式,在并行化之前将嵌套集合展平为一个更大的集合)。

如果您仍然发现并发对于 CPU 密集型工作来说太高,您可以将其与目标计算机上的实际内核数相匹配,例如如果您有 8 个可用内核:

Parallel.ForEach(
contexts,
new ParallelOptions { MaxDegreeOfParallelism = 8 },
context => { ...

但是,如果这是用于 IO 绑定(bind)工作,那么 Parallel.For*/.AsParallel 是错误的工具 - 使用异步并行工具,例如Task.WhenAll.

关于c# - 如何并行化 IEnumerable 的 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600408/

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