PLinq(Linq的并行计算)
上面介绍完了For和ForEach的并行计算盛宴,微软也没忘记在Linq中加入并行计算。下面介绍Linq中的并行计算。
4.0中在System.Linq命名空间下加入了下面几个新的类:
类 | 说明 |
ParallelEnumerable | 提供一组用于查询实现 ParallelQuery{TSource} 的对象的方法。这是 Enumerable 的并行等效项。 |
ParallelQuery | 表示并行序列。 |
ParallelQuery<TSource> | 表示并行序列。 |
原理2:PLinq最多会开启64个线程
原理3:PLinq会自己判断是否可以进行并行计算,如果不行则会以顺序模式运行。
原理4:PLinq会在昂贵的并行算法或成本较低的顺序算法之间进行选择,默认情况下它选择顺序算法。
在ParallelEnumerable中提供的并行化的方法
ParallelEnumerable 运算符 | 说明 |
AsParallel() | PLINQ 的入口点。指定如果可能,应并行化查询的其余部分。 |
AsSequential() | 指定查询的其余部分应像非并行 LINQ 查询一样按顺序运行。 |
AsOrdered() | 指定 PLINQ 应保留查询的其余部分的源序列排序,直到例如通过使用 orderby 子句更改排序为止。 |
AsUnordered() | 指定查询的其余部分的 PLINQ 不需要保留源序列的排序。 |
WithCancellation() | 指定 PLINQ 应定期监视请求取消时提供的取消标记和取消执行的状态。 |
WithDegreeOfParallelism() | 指定 PLINQ 应当用来并行化查询的处理器的最大数目。 |
WithMergeOptions() | 提供有关 PLINQ 应当如何(如果可能)将并行结果合并回到使用线程上的一个序列的提示。 |
WithExecutionMode() | 指定 PLINQ 应当如何并行化查询(即使默认行为是按顺序运行查询)。 |
ForAll() | 多线程枚举方法,与循环访问查询结果不同,它允许在不首先合并回到使用者线程的情况下并行处理结果。 |
Aggregate() 重载 | 对于 PLINQ 唯一的重载,它启用对线程本地分区的中间聚合以及一个用于合并所有分区结果的最终聚合函数。 |
下面是PLinq的简单代码
Code
- /// <summary>
- /// PLinq简介
- /// </summary>
- private void Demo11()
- {
- var source = Enumerable .Range(1, 10000);
- //查询结果按source中的顺序排序
- var evenNums = from num in source.AsParallel().AsOrdered()
- where num % 2 == 0
- select num;
- //ForAll的使用
- ConcurrentBag <int > concurrentBag = new ConcurrentBag <int >();
- var query = from num in source.AsParallel()
- where num % 10 == 0
- select num;
- query.ForAll((e) => concurrentBag.Add(e * e));
- }
上面代码中使用了ForAll,ForAll和foreach的区别如下:
PLinq的东西很繁杂,但是都只是几个简单的方法,熟悉下方法就好了。