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

news/2024/11/20 7:26:56/

本教程对应学习工程:魔术师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.ppmy.cn/news/615689.html

相关文章

kubernetes核心概念 controller

kubernetes核心概念 Controller 一、pod控制器controller 1.1 Controller作用及分类 controller用于控制pod 参考: https://kubernetes.io/zh/docs/concepts/workloads/controllers/ 控制器主要分为: Deployments 部署无状态应用&#xff0c;控制pod升级,回退ReplicaSet 副…

【实战】 JWT、用户认证与异步请求(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(五)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求1~56.用useAuth切换登录与非登录状态7.用fetch抽象通用HTTP请求方法&#xff0c;增强通用性8.用useHt…

EX Sports中文Telegram社区正式成立啦 欢迎中国地区的伙伴加入

完成任务即可领取EXS 任务&#xff1a; 1、 关注twitter3分 2、 转发本条推文2分 3、 加入中文Telegram社区5分 4、 将表单分享并且成功邀请好友5分/人 根据得分发放奖励 10分获得价值1USDT的EXS 20分获得价值2USDT的EXS 50分获得价值5UTSD的EXS 积分排名第一获得500…

谷歌该瑟瑟发抖了,在中国的鸿蒙取得成功后,欧洲也将挑战安卓

近日德国的手机制造商Hallo Welt Systeme UG发布一款Volla Phone 22手机&#xff0c;这款手机并未采用安卓系统&#xff0c;而是可以同时运行WindowsPhone 7、Linux、Firefox等操作系统&#xff0c;它希望为欧洲消费者提供更多样的选择&#xff0c;原因是谷歌安卓的垄断阻碍了欧…

新华LINUX牵手华旗资讯 强强联手打造新型移动存储设备

2005年12月12日&#xff0c;新华LINUX正式宣布&#xff0c;与北京华旗资讯数码科技有限公司签署共同合作协议&#xff0c;双方将合作推广新一代内置独立操作系统的智能移动存储产品。 目前&#xff0c;大部分移动存储产品还依旧停留于扩大存储容量、提高传输速度、改良外观造型…

华旗起诉海尔商标侵权案的前因后果

偶尔和朋友谈起华旗起诉海尔商标侵权案&#xff0c;虽然离这个案件正式起诉时间已经过去接近3个月&#xff0c;还是想在这里把老杳了解的情况向大家做个介绍&#xff0c;毕竟这起诉讼目前并没有结案&#xff0c;多了解些其中内情&#xff0c;或许对大家以后有所帮助。 事情的起…

曝荣耀仍未获得谷歌Android授权;诋毁鸿蒙的OPPO员工离职;微信圈子将停止运营|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

谷歌开源PaLM API /Meta再裁员10000人/ 全国高中C9联盟成立…今日更多新鲜事在此...

日报君 发自 凹非寺量子位 | 公众号 QbitAI 今天是3月15日星期三&#xff0c;国际消费者权益日。 不只今天&#xff0c;每天都要很好的维权哦&#xff01; 最近科技圈都发生了哪些新鲜事&#xff1f;一起来和日报君看看~ 谷歌在Gmail、Docs等办公应用中引入AI生成功能 GPT-4发布…