点击上方蓝字进行关注

有小伙伴问我每天忽悠的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准实时批量发送数据?

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

扫码关注我们

不会让您失望的。

三分钟总览微软任务并行库TPL相关推荐

  1. 数据流(任务并行库 TPL)

    TPL 数据流库向具有高吞吐量和低滞后时间的占用大量 CPU 和 I/O 操作的应用程序的并行化和消息传递提供了基础. 它还能显式控制缓存数据的方式以及在系统中移动的方式. 为了更好地了解数据流编程模 ...

  2. C#多线程开发-任务并行库

    你好,我是阿辉. 正文共2090字,预计阅读时间:6min. 之前学习了线程池,知道了它有很多好处. 使用线程池可以使我们在减少并行度花销时节省操作系统资源.可认为线程池是一个抽象层,其向程序员隐藏了 ...

  3. C# 学习笔记——PL 并行编程 TPL 和传统 .NET 异步编程

    C# 学习笔记--PL 并行编程 TPL 和传统 .NET 异步编程 Task C# 多线程和异步模型 TPL模型 Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Fa ...

  4. C#使用并行任务库(TPL)

    TPL(Task Parallel Library) 任务并行库 (TPL) 是 System.Threading和 System.Threading.Tasks 命名空间中的一组公共类型和 API. ...

  5. 微软并行库初体验之TPL

    前端时间因为要做个大数据量分析,所以用C#写了个脚本跑,不过由于算法复杂度问题,初步估计需要40小时才能跑完.为了加快运算,我一开始想到了 并行计算,利用MPICH或其他类似的分布式计算框架开发,不过 ...

  6. 用微软Custom Version识别水果:三分钟开发人工智能小应用

    微软Custom Vision提供了成熟开源的计算机视觉开发框架,你只需要上传十张训练图片,即可一键训练图像分类模型(比如识别不同的水果.花卉.地标.人脸).不需要具备任何深度学习算法知识,小学生都能 ...

  7. 多线程编程学习笔记——任务并行库(三)

    接上文 多线程编程学习笔记--任务并行库(一) 接上文 多线程编程学习笔记--任务并行库(二) 六.   实现取消选项 本示例学习如何实现基于Task的异步操作进行取消流程,以及在任务真正运行前如何知 ...

  8. 小猪的Python学习之旅 —— 10.三分钟上手Requests库

    小猪的Python学习之旅 -- 10.三分钟上手Requests库 标签:Python 一句话概括本文: 本节讲解Requests库的常见使用,以及一个实战项目: 扒取某一篇微信文章里所有的图片,视 ...

  9. .NET异步程序设计之任务并行库

    目录 1.简介 2.Parallel类 2.0 Parallel类简介 2.1 Parallel.For() 2.2 Parallel.ForEach() 2.3 Parallel.Invoke() ...

最新文章

  1. 台积电2纳米获得重大突破
  2. JS数组去重的6种算法实现
  3. 十六、深入Python字符串
  4. 匿名函数,结合闭包的写法,js对象的案例
  5. 用心推荐三个嵌入式方向精品号
  6. php异步处理下载文件,异步处理Excel文件导入【流程图+PHP示例】
  7. python基础技巧总结(三)
  8. fgo7.27服务器维护,【公告】更新游戏数据资料(7/27 实施)
  9. 软件安装下载的镜像站、国内源
  10. Hbase0.96 MVCC Lock 知识梳理
  11. 分享《通过开源项目去学习》
  12. 下载kaggle数据集
  13. WPS制作三线表并去除虚线详解(毕业论文可用)
  14. html中div hover的用法,CSS: hover选择器的使用详解
  15. 谷歌浏览器翻译插件 划词翻译
  16. xcode 真机调试无法选择对应设备 “ineligible devices“
  17. app开发者帐号(个人开发帐号、团队帐号、企业帐号、教育帐号)
  18. oldwain随便写
  19. APS高级计划与排程系统基本概念和功能说明
  20. AnyviewC编程作业系统——支持程序可视化运行、调试和测评

热门文章

  1. sql查询从m到n的这几条记录
  2. ASP.NET性能优化之构建自定义文件缓存
  3. 通过修改注册表设定浏览器的却省值
  4. python3.5安装pip_win10上python3.5.2第三方库安装(运用pip)
  5. 问题 1: 区间交集
  6. Spring-IOC XML 配置多个相同 ID 的 bean 加载分析
  7. Mono生命周期小实验
  8. (3)Python3笔记之变量与运算符
  9. Codeforces 365C - Matrix(hash + yy)
  10. 工作流与Petri net的关系