• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

《C#并行编程高级教程》第6章PLINQ:声明式数据并行笔记

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
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,传入一个希望的最大并行度

处理异常

需要注意延时执行的效果,一定要在使用的时候进行捕捉。






鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#获取图片某像素点RGB565值发布时间:2022-07-13
下一篇:
C#Quartz调度任务辅助类发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap