Ordered PLINQ ForAll

问题描述 投票:12回答:5

有关order preservation in PLINQ的msdn文档说明了有关ForAll()的以下内容。

  • 源序列为有序]时的结果:: [[不确定地并行执行源序列为
  • 无序]时的结果>:并行不确定地执行
  • 这是否意味着永远不能保证ForAll方法的有序执行?

    我以前没有使用过PLINQ,但是下面的Code Review question似乎是合适的用法。在我的答案的底部,我写:

Events.AsParallel().AsOrdered().ForAll( eventItem => { ... } );

阅读文档后,我相信AsOrdered()不会改变任何内容吗?我还怀疑先前的查询无法替换顺序很重要的简单for循环?可能还会并行调用StringBuilder,从而导致输出错误?

有关PLINQ中的订单保留的msdn文档说明了有关ForAll()的以下内容。排序源序列时的结果:不确定地并行执行当...

c# plinq
5个回答
16
投票
订单保留通常只应用于

结果

-即,输入可以按任何顺序进行处理

7
投票
正如其他人正确回答的那样,永远不能保证ForAll方法以任何特定顺序对可枚举元素执行操作,并且将默默地忽略AsOrdered()方法调用。

5
投票
AsOrdered()不会做任何改变-如果您想对并行查询的结果强制执行顺序,则可以简单地使用foreach() ForAll()来进行[[利用并行性,这意味着执行一次对集合中的多个项目产生副作用。实际上,排序仅适用于查询的结果(结果集合中项目的顺序),但这与ForAll()无关,因为ForAll()根本不影响该顺序。

4
投票
这是否意味着永远不能保证ForAll方法的有序执行?
是-不能保证订单。

0
投票
它将在多个内核上处理,然后对结果进行排序,因此存在排序的开销。这是answer on benchmarking simple for vs parallel

public static class ParallelExtensions { public static IEnumerable<T1> OrderedParallel<T,T1>(this List<T> list, Func<T,T1> action) { var unorderedResult = new List<(long, T1)>(); Parallel.ForEach(list, (o, state, i) => { unorderedResult.Add((i, action.Invoke(o))); }); var ordered = unorderedResult.OrderBy(o => o.Item1); return ordered.Select(o => o.Item2); } }

使用方式:

© www.soinside.com 2019 - 2024. All rights reserved.