PLINQ中减速器和组合器的语义

时间:2013-01-07 01:33:26

标签: .net plinq reducers

受到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();

0 个答案:

没有答案