【C#】并行编程实战:实现数据并行(1)

news2024/12/25 9:04:53

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

        到目前为止,我们已经掌握了并行编程、任务和任务并行的基础知识。本章将讨论并行编程的另一个重要方面,即数据并行。

        任务并行可以为每个参与线程创建一个单独的工作单元,而数据并行则可以创建一个公共任务,由源集合中每个参与的线程执行。由于源集合已经分区,因此可以由多个线程同时对其进行处理。理解数据并行对于从循环/集合中获得最佳性能非常重要。

        之前是把整个一章全部贴完,导致内容过大,动不动就几千字。后面还是多分篇幅,减少单篇长度。


1、从顺序循环到并行循环

        TPL 通过 System.Threading.Tasks.Parallel 类支持数据并行,该类提供 For 和 Foreach 循环的并行实现。作为开发人员无需同步或创建任务,而是由并行类处理的。

        首先我们做一个如下的列表:

        public static List<int> GetTestList(int length)
        {
            List<int> list = new List<int>();
            //简单地将数据顺序添加,以进行测试
            for (int i = 0; i < length; i++)
                list.Add(i);
            return list;
        }

        让我们首先顺序执行任务:

        private void RunBySequence()
        {
            var L = TestFunction.GetTestList(10);
            foreach (var item in L)
            {
                Debug.Log(item);
            }
        }

        这个结果就很显然了:

        数据同样也是被顺序地打印出来。

        接下来我们开始数据并行:

1.1、Parallel.Invoke

        这是并行执行一组操作的最基本方式,并且也是并行 for 和 foreach 循环的基础形式。使用时要注意以下要点:

  • 不能保证并行:操作是并行还是顺序将取决于 TaskScheduler 。

  • Parallel.Invoke 不保证传递操作的执行顺序。

  • 他将阻塞线程,直到所有操作完成。

          测试调用代码如下:

        private void RunByParallelInvoe()
        {
            var L = TestFunction.GetTestList(10);
            foreach (var item in L)
            {
                Parallel.Invoke(() =>
                {
                    Debug.Log(item);
                });
            }
        }

        上代码我试了几次,调用结果都是顺序执行的,打印结果和之前一模一样。我怀疑是我的测试环境下,这个任务比较简单,没有给系统足够压力以并行。

1.2、Parallel.For

        Parallel.For 是 For 循环的一种变体,不同之处在于其迭代是并行运行的。

        private void RunByParallelFor()
        {
            int length = commonPanel.GetInt32Parameter();
            var L = TestFunction.GetTestList(length);

            Parallel.For(0, length, (i, state) =>
            {
                Debug.Log(L[i]);
            });
        }

        这次打印的结果就有显然区别了:

         可以看到打印顺序并不是顺序的,而是并行的。在并行方法中,传入的两个参数,一个是当前下标,另一个是 ParallelLoopState ,可以调用其 Stop 和 Break 方法来中断线程运行:

var result = Parallel.For(0, length, (i, state) =>
{
    Debug.Log(L[i]);
    state.Break();
});

Debug.Log($"ParallelFor Result : {result.IsCompleted} | {result.LowestBreakIteration}");

        这里我们传入100个值的数组,打印出来结果如下:

         可见只打印了34次,而不是全部完成的100次。即便一开始运行就 Break 了,仍然会有 34 个任务执行了。把 Break 换成 Stop 执行效果是一样的,应该区别不大。

        对于返回的 ParallelLoopResult 其值有2个,意义如下:

IsCompleted

LowestBreakIteration

表示意义

true

N/A

运行至完成

false

Null

循环停止了预匹配

false

非零整数值

在循环中调用了 Break

        对于某些集合来说,顺序执行的工作速度更快,具体取决于循环的语法和正在执行的工作类型。

1.3、Parallel.Foreach

        Parallel.ForEach 循环是 ForEach 循环的一种变体,区别在于其中的迭代可以按并行方式运行。Parallel.ForEach 将对源集合进行分区,然后调度工作以运行多个线程。

        private void RunByParallelForeach()
        {
            var L = TestFunction.GetTestList(10);
            var result = Parallel.ForEach(L, (i, state) =>
            {
                Debug.Log(L[i]);
            });
            Debug.Log($"Parallel.ForEach Result : {result.IsCompleted} | {result.LowestBreakIteration}");
        }

        代码上修改很简单,输出结果也相同:


(未完待续)

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

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

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

相关文章

SpringSecurity认证流程(超级详细)

1 .前言 最近开发项目的时候遇到了和SpringSecurity相关的一些问题&#xff0c;但是之前并没有去了解过SpringSecurity&#xff0c;导致改系统安全权限验证的时候就比较吃力了&#xff0c;目前项目开发大多都直接用脚手架直接开发&#xff0c;系统安全权限验证已经形成了&…

漏洞复现|和信创天云桌面系统存在任意文件上传目录遍历漏洞

一、 阅读须知 一切从降低已有潜在威胁出发&#xff0c;所有发布的技术文章仅供参考&#xff0c;未经授权请勿利用文章中的技术内容对任何计算机系统进行入侵操作&#xff0c;否则对他人或单位而造成的直接或间接后果和损失&#xff0c;均由使用者本人负责。 郑重声明&#x…

2019年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版

2019 年 1 月份管综初数真题 一、问题求解&#xff08;本大题共 5 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。 1、某车间计划 10 天完成一项任务&a…

网络变压器/网络滤波器 国产化替代一般需要签订哪一些相关文件

Hqst华强盛导读&#xff1a;网络变压器/网络滤波器 国产化替代一般需要签订哪一些相关文件 在国内推广和应用国产替代网络变压器/滤波器时&#xff0c;需要签定一系列的文件&#xff0c;以确保网络变压器/滤波器的质量和安全&#xff0c;同时遵守国家相关的法律法规和政策规定…

JS实现选择图片剪裁及保存

JS实现选择图片剪裁及保存 以下是一个简单的示例代码&#xff0c;实现了显示一个文件上传框和一个canvas元素。用户可以选择一张图片文件后&#xff0c;该图像将显示在canvas中&#xff0c;并且用户可以通过鼠标拖拽来选取需要剪裁的区域。单击“剪裁”按钮&#xff0c;程序会…

8.11 TCP链接管理与UDP协议

目录 TCP的链接管理 TCP包头 连接的建立——”三次握手” 连接的释放——“四次挥手” 保活计时器 UDP协议 计算机网络体系结构 UDP协议 UDP的主要特点 UDP是面向报文的 TCP的链接管理 TCP包头 连接的建立——”三次握手” TCP 建立连接的过程叫做握手。 采用三报文…

java进阶—重要概念反射

反射概念 反射: 它是java中的一个很重要的概念,是框架设计的灵魂 框架呢&#xff1f;就是一个半成品软件&#xff0c;我们在这半成品上进行开发&#xff0c;比如我们经常提到spring springmvc springboot spingcloud 等等 也许有的小伙伴会说&#xff0c;框架别人都写好了&a…

Tdengine 时序数据库-安装与客户端连接

使用 TDengine 时序数据库的版本是 2.4.0.0 使用的安装RPM的安装方便安装 TDengine-server-2.4.0.0-Linux-x64.rpm 1. 安装指令: rpm -ivh TDengine-server-2.4.0.0-Linux-x64.rpm [rootnode3 server]# rpm -ivh TDengine-server-2.4.0.0-Linux-x64.rpm Verifying... …

python的格式化输出

print中的占位符(%-fomatting) print中的%d,%s等&#xff0c;只是一个占位符&#xff0c;等正确内容到了再查进去。 注意&#xff1a;变量值和打印内容之间不能有逗号隔开。 使用fomat方法 format底层可以理解成一个字典&#xff0c;默认key是按顺序从0开始&#xff0c;指定key…

nginxWebUI runCmd RCE漏洞复现

0x01 产品简介 nginxWebUI是一款图形化管理nginx配置的工具&#xff0c;能通过网页快速配置nginx的各种功能&#xff0c;包括HTTP和TCP协议转发、反向代理、负载均衡、静态HTML服务器以及SSL证书的自动申请、续签和配置&#xff0c;配置完成后可以一键生成nginx.conf文件&#…

网络变压器卷盘(封装载带)封膜压力标准

Hqst华强盛导读&#xff1a;网络变压器封装载带封膜压力标准通常是根据具体产品的封装材料和尺寸来确定的。 网络变压器封装载带封膜压力标准通常是根据具体产品的封装材料和尺寸来确定的。一般来说&#xff0c;封装载带的封膜压力应该足够大&#xff0c;以确保封装过程中封膜…

安卓开发基于KeyStore对数据进行加解密

问题背景 在我们App开发过程中&#xff0c;可能会涉及到一些敏感和安全数据需要加密的情况&#xff0c;比如登录token的存储。我们往往会使用一些加密算法将这些敏感数据加密之后再保存起来&#xff0c;需要取出来的时候再进行解密。 此时就会有一个问题&#xff1a;用于加解密…

计算机网络—应用层

文章目录 网络应用基本原理网络应用体系结构~三种结构网络应用进程通信网络应用需求 WEB应用HTTP协议Cookie技术WEB缓存/代理服务器技术 Email应用SMTP协议Email消息格式&#xff08;SMTP传输消息的格式&#xff09;POP3协议IMAP DNS应用DNS协议 网络应用基本原理 网络应用体系…

adb 工具

小白初如嵌入式的坑&#xff0c;对于串口调试工具&#xff0c;之前一直只知道有SecureCRT这一种方式&#xff1b; 但是在最近一次的使用过程中&#xff0c;发现抢占资源的情况出现&#xff0c;两个进程之间相互打架&#xff0c;这个时候需要 查看top&#xff08;嵌入式板子资…

Kernel panic – not syncing: Attempted to kill init! Redhat6.2故障修复

1、Linux环境 Redhat6.2&#xff0c; Linux version 2.6.32-220.el6.i686 (mockbuildx86-003.build.bos.redhat.com) (gccversion 4,4.5 20110214 (Red Hat 4.4.5-6) (GCC) ) #1 SMP Wed Nov 9 08:02:18 EST 2011 2、故障现象 修改TCP相关文件&#xff0c;重启完Linux系统之…

银河麒麟V10搭建达梦8数据库

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 目前&#xff0c;国产化服务器越来越多&#xff0c;操作系统的国产化使得大家对中间件都有了需求&#xff0…

alpha值大小对lasso回归结果的影响

LASSO 回归 的特点是在拟合广义线性模型的同时进行变量筛选&#xff08;variable selection&#xff09;和复杂度调整&#xff08;regularization&#xff09;。因此不论目标因变量&#xff08;dependent/response varaible&#xff09;是连续的&#xff08;continuous&#xf…

【FFmpeg实战】视频基础和MP4容器解封装

转载自原文地址&#xff1a;https://juejin.cn/post/6901218687081480206 一、视频的编解码方式 谈到视频&#xff0c;我们经常会听到视频编解码、H.264等诸如此类的内容。那么视频编解码是什么意思呢&#xff1f; 视频编解码&#xff0c;其实就是对视频数据进行压缩和解压缩…

ros版本KF-GINS(带有rviz可视化结果显示及文件生成)

原始的KF-GINS是基于读写文件实现的&#xff0c;在此基础上改进了ros版本&#xff0c;将原始数据文件转换为rosbag格式&#xff0c;并实现了rviz下的可视化结果显示&#xff0c;代码已共享至github https://github.com/slender1031/kf-gins-ros 感谢武汉大学卫星导航定位技术研…

IT培训的背后,是“韭菜”的躺赚梦!

本文只谈"骗局"&#xff0c;不谈其他&#xff0c;绝不引战&#xff0c;如有错误&#xff0c;希望指出我会及时改正。 实际也有大量做得好的、值得肯定的培训机构&#xff0c;这里需要大家仔细鉴别。 导语 为什么要写这篇文章呢&#xff0c;近些年培训这个话题也比较…