受到Clojure 1.5的reducers
库的启发,我一直在玩PLINQ的ParallelEnumerable.Aggregate()
方法的行为方式相同。在大多数情况下,它非常直接。
但我怀疑可能存在一种可能存在的行为差异。在Igor Ostrovsky's blog post about the 2007 CTP中,他声称combineAccumulatorsFunc
必须是可交换的。现代文献似乎没有说它必须是可交换的,我也无法强迫它做任何依赖于交换性的事情,但我也无法强迫它做任何事情。取决于相关性。
主要问题: combineAccumulatorsFunc
的语义是否在任何地方定义?即使不是,我是否可以假设它可以被联想地调用但不是可交换的?
我正在使用以下LINQPad代码段尝试导致无序combineAccumulatorsFunc
调用:
ParallelEnumerable.Range(0,1000000).AsUnordered().WithDegreeOfParallelism(10).
WithExecutionMode(ParallelExecutionMode.ForceParallelism).
Aggregate<int,IImmutableList<int>,IEnumerable<int>>(
() => { Thread.Sleep(new Random().Next(5000)); return ImmutableList<int>.Empty; },
(L,n) => n % 2 == 0 ? L.Add(n) : L,
(L1,L2) => {new {L1 = L1.First(),L2 = L2.First()}.Dump("partition"); return L1.Concat(L2).ToImmutableList();},
x => x.AsEnumerable()
).Dump();