【C#】并行编程实战:使用 PLINQ(1)

news2024/11/27 4:30:57

        PLINQ 是语言集成查询(Language Integrate Query , LINQ)的并行实现(P 表示并行)。本章将介绍其编程的各个方面以及与之相关的一些优缺点。

PLINQ 介绍 | Microsoft Learn了解如何使用 .NET 中的 PLINQ 并行执行查询。 PLINQ 代表并行语言集成查询 (LINQ)。icon-default.png?t=N5K3https://learn.microsoft.com/zh-cn/dotnet/standard/parallel-programming/introduction-to-plinq          本教程对应学习工程:魔术师Dix / HandsOnParallelProgramming · GitCode        


1、PLINQ 查询

        在 System.Linq 命名空间和 System.Core 程序集中可以使用 ParallelEnumerable 类。除了支持 LINQ 定义的大多数标准查询运算符(Query Operator)之外,ParallelEnumerable 类还包含许多支持并行执行的方法:

  • AsParallel:这是并行所需的种子方法。

  • AsSequential:通过更改并行行为来启动并行查询的顺序执行。

  • AsOrdered:默认情况下,PLINQ 不保留执行任务和返回结果的顺序。可以通过调用 AsOrdered 方法来保留此顺序。

  • AsUnordered:这是 ParallelQuery 的默认行为,可以被 AsOrdered 方法覆盖。通过调用此方法,可以将行为从有序更改为无序。

  • ForAll:使查询执行可以并行执行。

  • Aggregate:此方法可用于聚合并行查询中各种线程局部分区的结果。

  • WithDegreeOfParallelism:使用此方法时,可以指定用于并行查询执行的处理器的最大数量。

  • WithExecutionMode:使用此方法可以强制并行执行查询,或者让 PLINQ 决定是否需要按顺序或并行执行查询。

         扩展阅读:

详解c# 并行计算_C#教程_脚本之家本文主要介绍了并行计算的简单使用,并行循环的中断和跳出、并行循环中为数组/集合添加项、返回集合运算结果/含有局部变量的并行循环、、PLinq(Linq的并行计算)等相关内容。icon-default.png?t=N5K3https://www.jb51.net/article/202397.htmLINQPad - The .NET Programmer's Playgroundicon-default.png?t=N5K3https://www.linqpad.net/

2、PLINQ 查询简单示例

2.1、并行查询

        这里主要是为了演示并行查询,因此逻辑很简单,就是给定一个数,从列表中找是否有这个数:

        private void SearchNumberParallel()
        {
            //首先获取一个 0~10000的顺序列表:
            var L = Utils.GetOrderList(10000);
            //获取输入查询的目标值
            int targetNumber = commonPanel.GetInt32Parameter();
            //之后开始查询
            int i = 0;
            L.AsParallel().ForAll(x =>
            {
                if (targetNumber == x)
                {
                    Debug.Log($"已经查到:{x},在第{i} 次查询中找到!");
                }
                i++;
            });
            Debug.Log("查询完成");
        }

        如果我们是顺序遍历,那么显然我们输入什么参数,就应该是第几次查到:输入0就是第0次查到,输入999就是在第999次查到。我们运行上述代码,输入1024:

         显然这个顺序就变了,并不是 1024 次。

2.2、顺序查询

        那如果我们要保持查询顺序怎么办呢?只需要稍作修改API即可:

            L.AsParallel().AsSequential().All(x =>
            {
                if (targetNumber == x)
                {
                    Debug.Log($"已经查到:{x},在第{i} 次查询中找到!");
                    return false;//跳出循环
                }
                i++;
                return true;//继续循环
            });

        这样查询结果就如下所示了:

         这里只是 PLINQ 查询语句的简单示例。

3、在并行执行时保持顺序

        PLINQ 将按并行方式执行工作项,在默认情况下,它并不关心保留项目顺序以提高并行查询性能。但是,有时源集合项目中执行顺序很重要,此时需要保持顺序。

        在并行执行项目时保留顺序对性能有直接影响。因为我们需要在分区中保留原始顺序,并确保合并项目时顺序保持一致。

3.1、使用 AsOrdered 方法

        按照书上写的示例,代码如下:

        private void SearchNumberAsOrdered()
        {
            //首先获取一个 0~10000的顺序列表:
            var L = Utils.GetOrderList(10);
            //之后开始查询
            var orderd = L.AsParallel().AsOrdered().Select(x =>
            {
                Debug.LogWarning($"Select : {x}");
                return x;
            }).ToList();

            string foreachStr = "ForEachOrder : ";
            orderd.ForEach(x =>
            {
                foreachStr = $"{foreachStr} - {x}";
            });
            Debug.Log(foreachStr);
        }

        这个代码当然是顺序的…… 因为 orderd 的类型就是 List<T>。打印结果如下:

         如果我们把 AsOrdered 去掉呢?实际上结果也是一样的:

         说实话我不知道他这个 AsOrderd 生效在什么地方……

如何:在 PLINQ 查询中控制排序 | Microsoft Learn详细了解:如何:在 PLINQ 查询中控制排序icon-default.png?t=N5K3https://learn.microsoft.com/zh-cn/dotnet/standard/parallel-programming/how-to-control-ordering-in-a-plinq-query        后来我发现问题所在了,那就是取值的列表,我是自己生成的一个 List<int> ,而示例(无论是书上的还是微软官方网站)一直用的是 Enumerable.Range 生成的迭代器,我换成 Enumerable.Range(0,10) 一下子就和书上对上了。等于说是 List<T>本身对多线程有处理,就是顺序、线程安全的?

List表示可通过索引访问的对象的强类型列表。 提供用于对列表进行搜索、排序和操作的方法。 icon-default.png?t=N5K3https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.generic.list-1?view=netstandard-2.1#thread-safety        翻了下官方文档,好像确实是……

3.2、使用 AsUnOrdered 方法

        一旦在 PLINQ 上使用了 AsOrderd,查询就会按顺序执行。但是一直顺序执行会损失性能,因此我们希望在顺序工作完成之后,改为无序查询以提高性能。

        示例代码如下:

//首先获取一个 0~10的顺序列表:
var L = Enumerable.Range(0, 10);
orderd= L.AsParallel().AsOrdered().Take(5).AsUnordered().Select(x => x * x).ToList();

        这个操作就是取前5项元素,这一步是顺序的,然后再无序返回运算结果。执行结果就是 0~4 各自的平方无序返回为一个 List 。


(未完待续)

本文只是简单介绍了一下 PLINQ 语句的一些基本使用。

本教程对应学习工程:魔术师Dix / HandsOnParallelProgramming · GitCode        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人体微生物分布及其与人体的共生

我们知道&#xff0c;人体的皮肤、口腔、肺部、肠道、阴道等都是微生物的栖息地&#xff0c;每个部位都有独特的微生物群组成。微生物群受到基因、饮食、环境和生活方式等多种因素的影响。 当然&#xff0c;人体微生物群的组成也会随着年龄的增长而发生变化。从婴儿期到老年阶段…

什么皮肤微生物群:它是皮肤健康的关键吗?

在我们日常的护肤和美容过程中&#xff0c;我们经常听到关于皮肤的各种话题&#xff0c;从保湿到抗衰老&#xff0c;从痘痘到过敏... 随着科学的不断进步和技术的发展&#xff0c;人们开始逐渐发现&#xff0c;皮肤上隐藏着一个神秘的世界——皮肤微生物群。它在维护我们的皮肤…

CGLIB动态代理详解分析

一、介绍 CGLIB是强大的、高性能的代码生成库&#xff0c;被广泛应用于AOP框架&#xff0c;它底层使用ASM来操作字节码生成新的类&#xff0c;为对象引入间接级别&#xff0c;以控制对象的访问。CGLIB相比于JDK动态代理更加强大&#xff0c;JDK动态代理只能对接口进行代理&…

Django中如何正确使用 redis 如何在 Heroku 部署 Django时使用 Redis

文章目录 问题起源&#xff1a;AsyncWebsocketConsumer 中的 channel_layer解决方案安装 & 启动 redis安装 channel-redis更新 settings.py 的 redis 设置 Heroku 部署add-on 添加 Redis 组件settings.py 问题起源&#xff1a;AsyncWebsocketConsumer 中的 channel_layer 在…

真的不想搞清楚音频转换成mp3免费软件有哪些

曾经有一个音乐制作人&#xff0c;他有很多高质量的音频文件&#xff0c;但是他需要将它们转换成mp3格式才能分享给更多人。然而&#xff0c;他不想花费大量的金钱购买昂贵的软件。于是他开始寻找免费的音频转换软件&#xff0c;希望能够搞清楚音频转换成mp3免费软件有哪些。经…

SpringBoot教学资料5-SpringBoot一对多查询(带简单前端)

项目展示&#xff1a; 项目结构&#xff1a; SQL&#xff1a; CREATE TABLE t_article (id int(20) NOT NULL AUTO_INCREMENT COMMENT 文章id,title varchar(200) DEFAULT NULL COMMENT 文章标题,content longtext COMMENT 文章内容,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCR…

自制交流自动稳压器电路设计

目前在我国偏远的山区及农村&#xff0c;电网电压极不稳定&#xff0c;而且电压普遍偏低&#xff0c;有的电网电压只有 120V 左右。在这样的电网中&#xff0c;电视机及其它家用电器就无法正常使用了。市场上虽有较多的稳压器&#xff0c;但使用起来效果并不怎么好&#xff0c;…

Stable Diffusion 中Civitai站点模型管理助手

对于AI画画的读者来说&#xff0c;一旦开始使用Stable Diffusion&#xff0c;看到未曾使用过的模型&#xff0c;无法抑制下载的冲动。然而随着模型的堆积&#xff0c;整理及选择变得困难。此时Civitai Helper来解决这个问题。 文章目录 Civitai Helper插件安装模型信息模型更新…

Python WSGI 与 Web 开发框架

目录 文章目录 目录WSGIWSGI 的工作原理environ 参数start_resposne 参数 WSGI 的中间件 WSGI Web 开发框架OpenStack 中的应用案例进程入口WSGI Application 加载Paste/PasteDeployRoutesWebOb WSGI Server 启动 WSGI WSGI&#xff08;Web Server Gateway Interface&#xff…

【UE 材质】磨砂玻璃材质

效果 步骤 新建一个材质&#xff0c;这里命名为“M_FrostedGlass” 打开“M_FrostedGlass”&#xff0c;设置混合模式为半透明 添加如下节点&#xff1a; 创建一个材质实例 将材质实例赋予到一个mesh 打开材质实例&#xff0c;调整一下玻璃颜色和模糊值 原视频链接&#xff1a…

微信小程序UV、PV量解释以及接口调用频率

微信小程序UV、PV量 浏览量(PV)&#xff1a;即通常说的Page View(PV)&#xff0c;用户每打开一个网站页面就被记录1次。用户多次打开同一页面&#xff0c;浏览量值累计。微信小程序中PV是打开小程序的打开次数。 访客数(UV)&#xff1a;一天之内网站的独立访客数(以Cookie为依…

建立LIS系统需注意解决的问题

建立LIS需注意解决的问题 数据接收的可靠性&#xff1a;不管是采用硬件方式还是软件方式接收数据&#xff0c;保证接收过程数据不丢失或出现错误&#xff0c;是建立LIS首先要解决好的技术问题&#xff0c;否则就不是一个成功的LIS&#xff0c;缺乏实际的应用价值。 系统运行的…

vue3+vite使用particles.js

上效果&#xff1a; 1、安装vue3-particles 注意&#xff1a; 这里不能直接安装2.0以上的版本&#xff0c;否则界面无法出来。至于根本原因目前还没查到 # 通过以下命令可以发现当前所具有的版本 $ pnpm view vue3-particles versions [1.42.1, 1.42.2, 1.42.3, 1.42.4,1.43.…

【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)

一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战&#xff08;场景问题分析性能影响因素&#xff09; 常见的几个场景问题问题1&#xff1a;过期还是不过期缓存数据保证最终一致性 问题2&#xff1a;维度化缓存与增量更新通过维度化缓存优点和好处 问题3…

总在谈流程,却又做不好,问题出在哪?

时至今日&#xff0c;流程这个概念无论是在理论层面还是实践层面&#xff0c;都已为大家所熟知。 特别是随着华为的崛起&#xff0c;流程的吸引力与日俱增&#xff0c;为数不少的企业都在服用流程这剂灵丹妙药。 可是&#xff0c;真正搞明白流程概念的企业还不算多&#xff0…

win10开启远程桌面,win10开启3389端口

文章目录 前言一、不能远程桌面的原因1.1、系统设置未开启远程桌面功能1.2、开启防火墙3389端口1.3、开启3389端口 二、开启3389端口2.1、查看是否开启端口2.2、启动远程桌面服务2.3、远程连接administrator账号提示由于账户限制无法登录 三、其他 前言 最近重装了一下小主机系…

Unity 非父子物体保持相对静止

非父子物体保持相对静止 &#x1f354;效果&#x1f96a;食用 &#x1f354;效果 保持两个非父子关系的物体坐标、旋转相对静止 &#x1f96a;食用 插件下载 using System.Collections; using System.Collections.Generic; using UnityEngine;namespace ZYF {public class…

IntelliJ IDEA路径里面的反斜杠变成了其他符号解决办法

IntelliJ IDEA里面配置任何路径的时候路径里面的反斜杠分隔符变成了其他符号解决办法。 问题如图&#xff1a; 路径都变成了W加删除线。 原因&#xff1a; 字体设置问题&#xff0c;字体把斜杠转义了。 解决&#xff1a; 别用Gothic的相关字体&#xff0c;换成其他字体即…

如何在可视化页面中保证数据安全?Sugar BI通过URL参数标识用户,灵活实现用户权限

公开分享之后的大屏/报表页面中&#xff0c;由于不需要用户登录账号&#xff0c;因此页面中 数据模型的行级别权限、SQL 建模中嵌入用户邮箱、API 后端获取当前登录用户 这些需要用户登录账号才能进行的权限限制功能都不可用。 但是在一些场景下&#xff0c;是期望这些权限功能…

滴水逆向三期笔记与作业——02C语言——04 IF语句逆向分析上

OneNote防丢失。 海哥牛逼。 IF语句逆向分析上 一、内存图二、如何判断函数的参数2.1 一般情况 三、if的汇编案例根据汇编还原if 四、作业 一、内存图 二、如何判断函数的参数 2.1 一般情况 三、if的汇编 案例 根据汇编还原if 四、作业 海哥牛逼。