zoukankan      html  css  js  c++  java
  • PLINQ 简介

      PLINQ和LINQ的语法基本是差不多的,PLINQ该如何实现并行

    var query = from item in source.AsParallel()
                            where Compute(item) > 42
                            select item;

    一个简单的AsParallel方法就能实现并行运行,要声明的是AsParallel方法返回的是ParallelEnumerable而不是Enumerable,如GO语言的go关键字一般简单,虽然我怎么学过go语言,但我知道GO关键字绝对不会这么简单,同样PLINQ并行一样不是这么简单,虽然两个不是一个级别的吧。必须要说明的是不要盲目的使用PLNQ,PLINQ会对输入元素进行分区,增加了复杂性,会有一定性能的消耗,通俗的讲就是你select的语句消耗的时间很短,要小于多线程之间频繁切换的时间。

    PLINQ 四种分区方式

      1、范围分区:对输入的元素根据处理器核数对元素进行平分,元素为实现了IList<T>接口的类型。

      2、区块分区:每个线程使用一块区域内的一定数量的元素,区块大小不固定,执行过程中,会动态的进行调整,原则是尽可能保证所有任务同时完成。

      3、条带分区:跳过n个元素,处理m个元素,处理完成后跳过n个元素,执行m个元素

      4、散列分区:。。。。。。没理解,只知道同3一样是对特定的查询进行优化。

    并行执行的算法:管道,停止并运行,反向枚举三种算法。

      管道:创建处理器核数+1个线程,一个枚举线程记录状态,其他执行操作

      停止并运行:ToList,ToArray等需要完整结果的的操作时使用该方法,但将占用更多的内存

      反向枚举:使用AsParallel方法后,调用ForAll方法

    PLINQ的并行不是绝对的,下面的列表介绍了 PLINQ 默认情况下将按顺序模式执行的查询形状:

    • 包含 Select 子句、已建立索引的 Where 子句、已建立索引的 SelectMany 子句或 ElementAt 子句的查询(在排序或筛选运算符移除或重新排列了索引后)。

    • 包含 Take、TakeWhile、Skip、SkipWhile 运算符并且源序列中的索引未采用原始顺序的查询。

    • 包含zip或SequenceEquals的查询,除非,其中一个数据源具有原始顺序排列的索引和其他数据源可建立索引(IE.. 数组或ilist(t))。

    • 包含 Concat 的查询,除非将其应用到可建立索引的数据源。

    • 包含 Reverse 的查询,除非应用到可建立索引的数据源。

     提到过AsParallel方法返回的是ParallelEnumerable,下面列出ParallelEnumerable中几个方法,是我们更加灵活的使用PLINQ(PD:虽然公司里应该不会用到~)。

    AsOrdered和AsUnordered方法,告诉PLINQ结果序列中顺序是否(看的比钱)重要。

    AsSequential:强制顺序执行。

    AsExecutionMode:强制并行执行。

    WithDegreeOfParallelism:指定并行时最大的线程数。

    WithMergeOptions:设置PLNQ执行时的缓存类型,建议使用默认模式AutoBuffered。

    没有贴多少代码,估计自己以后看都懒的看了,因为我没有从头到尾的敲下来,在图书馆几点知识点回来结合网络就这么整理一下,那么怎么才能用到PLINQ(在代码中查找类似循环能被并行执行的代码,尝试转为并行)。

  • 相关阅读:
    sql 同一行中,不同结果在不同列显示
    用jstl的if或when标签判断字符串是否为空
    RESTful 接口规范
    HTTP协议详解
    easyui datagrid 去除单击行选中事件
    easyui datagrid 选中行效果
    Nodejs
    VMware 中的win7虚拟机在一段时间后就会自动挂起
    Vmware 安装 ghost 版 win 7
    idea tomcat 乱码问题的解决及相关设置
  • 原文地址:https://www.cnblogs.com/my-tzc/p/3436529.html
Copyright © 2011-2022 走看看