三分钟总览微软任务并行库TPL

点击上方蓝字进行关注

有小伙伴问我每天忽悠的TPL是什么?

☹️ 这次站位高一点,严肃讲一讲。

引言

俗话说,不想开飞机的程序员不是一名好爸爸;作为微软技术栈的老鸟,一直将代码整洁之道奉为经典, 优秀的程序员将优雅、高性能的代码看成自己的脸面。

今天探讨下我对.NET并行编程库Task Parallel Library的理解,开足马力,准备压榨CPU了。

双核cpu的真相.gif

技术背景

硬件线程和软件线程

   多核处理器带有一个以上的物理内核:物理内核是真正的独立处理单元,多个物理内核使得多条指令能够同时并行运行。

硬件线程也称为逻辑内核,一个物理内核可能会使用超线程技术提供多个硬件线程,所以一个硬件线程并不代表一个物理内核。程序通过Environment.ProcessorCount 得到的就是逻辑内核(本人的机器是i5-5300U 虚拟4核), Windows中每个运行的程序都是一个进程,每一个进程都会创建并运行一个或多个线程,这些线程称为软件线程,硬件线程就像是一条泳道,而软件线程就是在其中游泳的人。

并行场景

.NET引入的Task Parallel Library(任务并行库,TPL),动态地扩展并发度,以最有效的方式使用所有可用的处理器。

另外TPL支持分区工作、支持基于ThreadPool调度、支持取消异步操作、支持状态管理。

通过TPL专注与让程序完成你业务意义上的任务,同时最大限度的提高程序性能。

TPL同时支持数据并行、任务并行和流水线Dataflow

1.数据并行:有大量数据需要处理,并且必须对每一份数据执行同样的操作;2.任务并行:通过任务并发运行不同的操作;3.流水线:任务并行和数据并行的结合体(需要引入System.Threading.Tasks.Dataflow组件库) 
其中1、3 已经在上文演示,本文就随手拿数据并行、任务并行聊一聊。

编程实践

1. 数据并行

找到100000以内素数的个数

上文[共享内存并发模型],代码可做如下优化:

由每个线程独立计算线程内迭代产生的素数和,最后再对几个和求和。

using System;
using System.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;/// <summary>
/// 利用并行编程库Parallel,计算100000内素数的个数
/// </summary>
namespace Paralleler
{class Program{static void Main(string[] args){Stopwatch sw = new Stopwatch();sw.Start();ShareMemory();sw.Stop();Console.WriteLine($"优化后的共享内存并发模型耗时:{sw.Elapsed}");}static void ShareMemory(){var sum = 0;Parallel.For(1, 100000 + 1, () => 0, (x, state, local) =>{var f = true;if (x == 1)f = false;for (int i = 2; i <= x / 2; i++){if (x % i == 0)  // 被[2,x/2]任一数字整除,就不是质数f = false;}if (f == true)local++;return local;},local =>{Interlocked.Add(ref sum, local);});Console.WriteLine($"1-100000内质数的个数是{sum}");}}
}
参数1,2 表示数据并行要操作的对象;
参数3localInit表示某线程内迭代的初始值,将会作为参数4body委托的第3个参数,只在线程第一次使用;参数4body表示每个迭代都需要经历的执行体, 这里以线程为单元处理迭代;
参数5localFinally对每个线程的输出再做一次计算,入参是参数4的输出。

2. 任务并行

  让许多方法并行运行的最简单的方法就是使用Parallel类的Invoke方法,Invoke方法接受一个Action的参数组

void  System.Threading.Tasks.Parallel.Invoke(WatchMovie, HaveDinner, ReadBook, WriteBlog);

这段代码会创建指向每一个方法的委托。

没有特定的执行顺序

Parallel.Invoke方法只有在4个方法全部完成之后才会返回。它至少需要4个硬件线程才足以让这4个方法并发运行。


但并不保证这4个方法能够同时启动运行,如果一个或者多个内核处于繁忙状态,那么底层的调度逻辑可能会延迟某些方法的初始化执行。

捕捉并行循环中发生的异常

当并行迭代中调用的委托抛出异常,这个异常没有在委托中被捕获到时,就会变成一组异常,新的System.AggregateException负责处理这一组异常。

本文为微软TPL入门级教程,学习一个专题,了解特性/能力最重要, 剩下的就是结合场景去应用。

本文内容和制图均为原创,文章永久更新地址请参阅左下角原文,如对您有所帮助,【在看、点赞】来一发,未尝不可 。

专题相关 一网打尽

  三分钟掌握共享内存 & Actor并发模型~~~

 你管这叫"线程安全"?~~~

 .Net线程同步技术解读

 Redis分布式锁抽丝剥茧

 看过这么多爆文,依旧走不好异步编程这条路?

 TPL Dataflow组件应对高并发,低延迟要求

 如何利用.NETCore向Azure EventHubs准实时批量发送数据?

 难缠的布隆过滤器,这次终于通透了

扫码关注我们

不会让您失望的。

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

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

相关文章

第五章 MyEclipse配置hadoop开发环境

1.首先要下载相应的hadoop版本的插件&#xff0c;我这里就给2个例子&#xff1a; hadoop-1.2.1插件&#xff1a;http://download.csdn.net/download/hanyongan300/6238153 hadoop2.2.0插件&#xff1a;http://blog.csdn.net/twlkyao/article/details/17334693 上一章我也讲了怎…

这才是真正的,坐上来,自己动!| 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅你有见过加辣的奶茶吗&#xff1f;什么叫做科技改变生活其实你的猫一直都看不起你坐上来&#xff0c;自己动&#xff01;安全带使用体验当iPhone遇上数学在B站UP主的剪刀下诞生了各种神奇的CP组合其中最受欢迎的居然是伏地魔和林黛玉…

九项路考(2)

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />二、侧方位停车<?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" />要点&#xff1a;1、倒车入停车位&#xff08;1&#xff09;挂倒档&#xf…

360导航源码php,51zxw 仿360网址导航源码

1.上传网站安装程序到空间&#xff0c;空间需支持PHP&#xff0c;MYSQL数据库20M 即可。2.访问网网址执行安装&#xff0c;按照提示填入mysql数据库信息。3.安装时默认设置后台管理 用户&#xff1a;admin 密码&#xff1a;123456 (以防安装出错建议默认安装&#xff0c;然后登…

SRM 440(1-250pt, 1-500pt)

DIV1 250pt 题意&#xff1a;小球从一段折线斜坡上滚下来&#xff0c;告诉所用时间&#xff0c;求重力加速度。 解法&#xff1a;二分答案模拟即可。 tag:二分&#xff0c;simulation 1 // BEGIN CUT HERE2 /*3 * Author: plum rain4 * score :5 */6 /*7 8 */9 // END CUT…

技术 Leader 怎样带跨一个团队?

网上很多分析大公司&#xff0c;小公司的文章&#xff0c;都会提到在大公司工作就是螺丝钉&#xff0c;岗位分的非常细&#xff0c;每个人把自己的专职工作做好就行&#xff1b;而在小公司需要每个人都是多面手&#xff0c;一岗多职。这种观点我同意一半&#xff0c;在小公司中…

我怀疑全国最会吹牛的人,都在这8个公众号上了

全世界只有3.14 % 的人关注了青少年数学之旅学习如逆水行舟&#xff0c;不进则退&#xff1b;只有坚持不断的学习,才能保持进步。今天给大家精心挑选的这几个优质的公众号&#xff0c;在行业深耕已久&#xff0c;相信大家一定会有所收获&#xff0c;感兴趣的可以关注一下。Pyth…

linux磁盘管理------LVM

一、需求分析1&#xff0c;当我们需要存储一个500G的不可分割文件时&#xff0c;但是我们设备上没有这么大的单个磁盘。2&#xff0c;当我们在搭建一个服务&#xff0c;由于日常运转产生大量文件&#xff0c;磁盘容量不够用了&#xff0c;怎么办&#xff1f;添加磁盘&#xff0…

在 .NET 中创建对象的几种方式的对比

在 .net 中&#xff0c;创建一个对象最简单的方法是直接使用 new (), 在实际的项目中&#xff0c;我们可能还会用到反射的方法来创建对象&#xff0c;如果你看过 Microsoft.Extensions.DependencyInjection 的源码&#xff0c;你会发现&#xff0c;为了保证在不同场景中的兼容性…

.NET设计模式(16):模版方法(Template Method)

摘要&#xff1a;Template Method模式是比较简单的设计模式之一&#xff0c;但它却是代码复用的一项基本的技术&#xff0c;在类库中尤其重要。主要内容1&#xff0e;概述2&#xff0e;Template Method解说3&#xff0e;.NET中的Template Method模式4&#xff0e;适用性及实现要…

数学界最恐怖的存在,学过数学的人,一辈子都不会忘记!

全世界只有3.14 % 的人关注了青少年数学之旅何谓数学&#xff1f;数学家Eduardo曾这样回答“数学是永恒&#xff0c;是真理&#xff0c;是一切的答案。”回首往昔数学始终伴随我们左右纵横交错的几何、繁琐复杂的运算难以求解的方程、无从下手的猜想......尽管在数学道路上有多…

把我的爱送给你――C#3.5(这题目似乎写错了)

本文发表于 中国IT实验室周报。这是我初次写给杂志社稿件&#xff0c;其中必有许多不足之处&#xff0c;还望大家见谅&#xff0c;虽然这篇文章质量可能不太高&#xff0c;但我希望能将个人的这些总结与大家分享。 从笔者接触编程至今&#xff0c;经历了数种编程语言&#xff0…

Blazor 数据绑定开发指南

翻译自 Waqas Anwar 2021年3月21日的文章 《A Developer’s Guide to Blazor Data Binding》 [1]现如今&#xff0c;大多数 Web 应用程序要么是在页面上显示某种数据&#xff0c;要么是使用表单从用户那里收集数据。这意味着每个 SPA 框架都必须支持数据绑定&#xff0c;以便开…

葛优:你们有看过我的作品吗?| 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅

阳江海滩景色一瞥

前几天同学去阳江的海边玩了2天&#xff0c;海景相当不错&#xff0c;不敢独享&#xff0c;特来贴图。 转载于:https://www.cnblogs.com/absolute8511/archive/2008/05/24/1649638.html

使用表达式自定义Serilog输出格式

Serilog是.NET Core中常用的结构化日志类库&#xff0c;透过logging API可以轻松的记录应用程式中对象属性&#xff0c;方便快速进行logging内容进行查询与分析&#xff0c;并将其记录内容通过指定方式输出。今天&#xff0c;介绍一个Nuget包Serilog.Expressions&#xff0c;它…

那些不回微信的人,都在看什么?

全世界只有3.14 % 的人关注了青少年数学之旅有人统计过&#xff0c;我们平均每天花在看内容上的时间是5-6小时&#xff0c;只要拥有一个手机&#xff0c;我们似乎无所不知。但&#xff0c;你是否还记得昨天都看了哪些内容&#xff1f;你能将它们一一都说出个大概吗&#xff1f;…

怎样让WinForms下DataGrid可以像ASP.NET下的DataGrid一样使用自定义的模板列

昨天被问到一个问题&#xff1a;怎么把WinForms里的DataGrid的绑定了数据库bit字段的列默认显示的CheckBox换成“男”和“女”&#xff0c;也就是说怎么样像ASP.NET的模板列那样可以自定义。&#xff08;此处不考虑在SQL在用Case把数据结果转换了&#xff09;由于&#xff0c;基…

智能优化算法应用:基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于原子轨道搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.原子轨道搜索算法4.实验参数设定…

dotnet中的counters说明(三)

本篇分别说明一下System.Net下的Http计数器&#xff0c;NameResolution计数器&#xff0c;Security计数器和Sockets计数器。同时&#xff0c;下面指标各项()里的项目是--counters 参数[]里的项&#xff0c;用逗号分隔多项指标。System.Net.Http计数器以下计数器由 HTTP 堆栈发布…