在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
PLINQ这个话题好多书都写到过,这本也没有什么特别好的地方。
几个有用和有趣的点记录一下。
顺序的不确定性用PLINQ就一定要记住并行后会导致顺序不确定的问题。解决方案就是AsOrdered或者orderby子句。
var keysWith10Letters = from key in Keys.AsParallel().AsOrdered()
where (CountLetters(key) >= 10) && (key.Contains('A')) && (key.Contains('F')) && (key.Contains('9')) && (!key.Contains('B')) select key; var keysWith10Letters = from key in Keys.AsParallel() where (CountLetters(key) >= 10) && (key.Contains('A')) && (key.Contains('F')) && (key.Contains('9')) && (!key.Contains('B')) orderby key select key; PLINQ中的数据分区这部分讲的不错,但是需要图片才比较好讲解。在书的P229-233
PLINQ中的规约操作这里指的就是聚合函数。普通的求和,求平均值类的,反正提供好了,用就好了。
有趣的是,提供了一个Aggregrate函数,可以自定义聚合函数。
给一段求方差的代码段
int[] inputIntegers = { 0, 3, 4, 8, 15, 22, 34, 57, 68, 32, 21, 30 };
var mean = inputIntegers.AsParallel().Average(); var standardDeviation = inputIntegers.AsParallel().Aggregate( // Seed 0d, // Update accumulator function (subTotal, thisNumber) => subTotal + Math.Pow((thisNumber - mean), 2), // Combine accumulators function (total, thisTask) => total + thisTask, // Result selector (finalSum) => Math.Sqrt((finalSum / (inputIntegers.Count() - 1)))); mean的求值就是内置的聚合函数。 自定义的聚合函数给需要四个参数(另有重载版本,可以不需要这么多参数) 自定义并行的聚合函数的思路是,定义一个初始值,处理每一项,处理每一个分区,得到最终结果。 这也对应了Aggregrate方法的四个参数。 第一个参数 给一个累计的初始值 第二个参数 对每一项进行操作,并累计效果 第三个参数 对每一个分区进行操作,并累计效果 第四个参数 做最后的整理 取消PLINQ使用WithCancellation,传入一个CancellationToken参数
制定并行度使用WithDegreeOfParallelism,传入一个希望的最大并行度
处理异常需要注意延时执行的效果,一定要在使用的时候进行捕捉。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论