• PLinq


    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
    1.         /// <summary>
    2.         /// PLinq简介
    3.         /// </summary>
    4.         private void Demo11()
    5.         {
    6.             var source = Enumerable .Range(1, 10000);
    7.             //查询结果按source中的顺序排序
    8.             var evenNums = from num in source.AsParallel().AsOrdered()
    9.                        where num % 2 == 0
    10.                        select num;
    11.             //ForAll的使用
    12.             ConcurrentBag <int > concurrentBag = new ConcurrentBag <int >();
    13.             var query = from num in source.AsParallel()
    14.                         where num % 10 == 0
    15.                         select num;
    16.             query.ForAll((e) => concurrentBag.Add(e * e));
    17.         }

    上面代码中使用了ForAll,ForAll和foreach的区别如下:

    image

    PLinq的东西很繁杂,但是都只是几个简单的方法,熟悉下方法就好了。

  • 相关阅读:
    Es module vs require
    phaser3 画虚线实现
    新的计划
    [转]Boostrap Table的refresh和refreshOptions区别
    Storing Java objects in MySQL blobs
    【转】Ubuntu下搜狗输入法突然无法输入中文
    团队作业六
    团队作业七
    团队作业四
    团队作业三
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3794994.html
Copyright © 2020-2023  润新知