写在前面

之前微信公众号里有一位叫sara的朋友建议我写一下Parallel的相关内容,因为手中商城的重构工作量较大,一时之间无法抽出时间。近日,这套系统已有阶段性成果,所以准备写一下Parallel的相关内容,正好也延续之前的C#并发编程系列。

Parallel是并行编程的相关内容,而Parallel.For和Parallel.Foreach又是并行编程中相当重要的方法,所以不能孤立的去讨论Parallel,必须要放到并行编程的讨论中去

并行化,一般是对所要完成的任务进行划分,并且以并发的方式处理属于自己的那份任务,并且最终可以做到整合,所以并行化总会产生并发性。

实际上并行是并发的子集,并发和并行都可以多线程执行,就看其处理器是否是多核的,这些线程能不能同时被cpu多个核执行,如果可以就说明是并行,而并发是多个线程被cpu单核轮流切换着执行。总之,只有在多核处理器上并行才会有意义

并行化总会有着很大的挑战,即每一个部分以不同顺序或者交错执行,都能保证最终结果的正确性,尤其涉及到各并行部分之间需要串行执行的部分,这个挑战是很大的。由于并行化程序设计要比普通的串行代码复杂很多,也难维护很多,所以不是所有的问题都可以使用并行的。比如绝对执行时间本来就很少,即使使用并发可以提高整体的执行时间,那么我们也应该使用传统方式。但是如果主要涉及到提升用户响应能力的功能,那么我们推荐使用并行编程,同时处理分割后依然可以独立进行而不影响整体任务的功能也可以使用并行编程。

并行的相关实战

说到并行,就需要先说下.NET FX4中引入的Task Parallel Library(任务并行库),简称TPL。TPL主要覆盖了三大使用场景,数据并行、任务并行和流水线,TPL以其高度的封装特性,隐藏了并行编程里复杂的处理,使得开发人员可以以较低的门槛进行并行编程。

数据并行

这种场景在于有大量数据需要处理,而且对每一份数据都要执行的同样的操作。

任务并行

有很多相对独立的不同操作,或者可以分割成多个子任务但彼此之间是独立的,就可以通过任务并行来发挥并行化的优势

流水线

流水线是以上两种场景的结合,这个也是最复杂最难处理的场景,因为这里面涉及到多个并发的任务进行协调处理。

此场景,奈何小编理解的不是很好,所以不敢乱写,多方查找资料,找到了oschina上的一篇文章。

流水线技术,指的是允许一个机器周期内的计算机各处理步骤重叠进行。特别是,当执行一条指令时,可以读取下一条指令,也就意味着,在任何一个时刻可以有不止一条指令在“流水线”上,每条指令处在不同的执行阶段。这样,即便读取和执行每条指令的时间保持不变,而计算机的总的吞吐量提高了。

原文地址:https://my.oschina.net/u/3374461/blog/1930305

System.Threading.Tasks.Parallel类

虽然Parallel类在System.Threading.Tasks命名空间下,但是创建并行代码不一定要直接使用Task类的实例,我们可以直接使用Parallel静态类所提供的方法。

Parallel.For:为固定数目的独立For循环迭代提供了负载均衡式的并行执行

Parallel.For(0, 5, i =>
{Console.WriteLine("the number is", i);
});

Parallel.Foreach:为固定数目的独立ForEach循环迭代提供了负载均衡式的并行执行。这个方法支持自定义分区器(Partitioner),以使得我们可以完全掌控数据分发。

string[] letters = new string[] {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"};
Parallel.ForEach(letters, i => Console.WriteLine("letter is " + i));

Parallel.Invoke:为给定的独立任务提供了负载均衡式的并行执行,接下来会重点讨论这个方法。

Parallel.Invoke

这个方法很实用,也很简单。

以下代码可以返回void的无参数方法:

Parallel.Invoke(Method1(), Method2(), Method3(), Method4());
通过Lambda表达式运行: 
Parallel.Invoke(() => Method1(), () => Method2(), () => Method3(), () => Method4());

通过Lambda表达式和匿名类型来运行:

Parallel.Invoke(() =>
{Method1();// Do something
},
() =>
{Method2();// Do something}, () =>{Method3();// Do something}, () =>{Method4();// Do something
});

以上代码需要并行执行四个方法,但是如果空余逻辑内核不足四个或者根本就没有四个逻辑内核,这四个方法是不能并发执行的。因此在理想情况下,正好有至少四个空余逻辑内核时,我们就可以并行执行这四个方法了。

这四个方法,我们无法准确的预测其执行顺序,因为这一切是由底层的逻辑会根据运行时的现有可用资源创建出最合适的执行计划。当然TPL依然有机制保证方法的顺序执行,这个以后我们再讨论。

Parallel.Invoke最大的优势就是简单,但是并不能因为它简单,就不分场合的使用,事实上,我们需要在某些场景下权衡使用。

  • 如果这四个方法的执行时间不一致,那么就需要根据最长的执行时间才能返回控制,这就可能造成一些逻辑内核处于闲置状态。所以我们需要预测一下大致的执行时间,如果时间过长,那么就要认真考虑是否真的需要使用这个方法。

  • 其扩展性很差,因为它只能调用固定数目的逻辑内核,剩余内核就会一直处于闲置状态。

  • 方法之间的交互极其困难,极易产生Bug,当然这是并行编程的常见问题,TPL也考虑到了这点,也有足够机制解决这个问题。

  • 如果其中某个方法有了异常,捕捉异常会很困难,所以需要大家在相应的被调用方法里编写足够的日志。

  • 小编在以前的使用中还遇到了内存溢出的异常,这些也会在以后的文章中说明其原因以及解决方法。

今天就写到这儿吧,已经十二点了,要休息一下,保护头发了,哈哈哈。

C#并发编程之初识并行编程相关推荐

  1. 从头开始进行CUDA编程:Numba并行编程的基本概念

    作者 | CarlosCosta 编辑 | 极市平台 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[模型部署]技术交流群 后台回复[ ...

  2. C#并行编程-并发集合

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  3. dnet 并行编程学习总结

    .Net并行编程高级教程--Parallel http://www.cnblogs.com/stoneniqiu/p/4857021.html 一直觉得自己对并发了解不够深入,特别是看了<代码整 ...

  4. C#中的多线程 - 并行编程 z

    原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加 ...

  5. 并行:并行编程的基础概述

    并行编程的目的 并行编程主要有三个目的:性能(performance),通用性(versatility),生产率(productivity).简称PVP 注意区分并行和并发的概念: 并行:一个任务可以 ...

  6. Delphi xe7并行编程快速入门

    现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...

  7. c语言多核编程,多核并行计算——并发与并行编程问题

    并发是用来描述并行执行的方式(看上去一起发生的事件,例如目前操作系统的多任务调度程序,看上去桌面上有许多程序在同时运行.),并发是形容词. 并行是指通过并发将一个操作分解成一组粒度更细的工作单元,并且 ...

  8. 多核时代,并行编程为何“臭名昭著”?

    作者 | Yan Gu 来源 | 转载自知乎用户Yan Gu [导读]随着计算机技术的发展,毫无疑问现代计算机的处理速度和计算能力也越来越强.然而细心的同学们可能早已注意到,从2005年起,单核的 C ...

  9. linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...

    摘要: <微软技术丛书:Visual Studio2010并行编程从入门到精通>循序渐进,步骤式动手练习迅速帮助读者掌握并行编程的基础知识. <微软技术丛书:Visual Studi ...

最新文章

  1. Java 多线程(二)线程间的通信应用--生产者消费者(未完)
  2. 域电脑不能显示桌面_学会这些电脑操作,工作更高效,摸鱼更舒适!
  3. 输入十个数,输出其中最大数、下标,用函数实现
  4. spring学习笔记01-BeanFactory和ApplicationContext的区别
  5. Python使用for循环打印九九乘法表
  6. 迟来的2013年总结及算法工程师/研究员找工作总结
  7. ftp服务器不能读取文件内容_使用file_get_contents()函数读取文件内容
  8. django后台集成富文本编辑器Tinymce的使用
  9. linux开发环境搭建(4)-从SD卡启动uboot
  10. 【IDEA类注释模板和方法注释模板】
  11. element table表头设置换行
  12. C语言快速互转HEX(16进制)和原始字符串/数组
  13. 【多传感器融合定位】【从零开始做自动驾驶定位_任佬】【所学到的东西汇总】
  14. Flask、sqlite3、pipenv实现用户注册和登录(HandBook,菜鸟都会的)
  15. CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]
  16. 关于编译型语言函数的调用(一)
  17. 打分五角星html制作,css简单实现五角星评分、点赞收藏、展示评分(半颗星、1/3颗星)...
  18. 优矩互动在港挂牌上市:三个高度集中,马晓辉身价接近30亿元
  19. c++ [Error] conflicting declaration的错误
  20. 用单片机c51电子秤的c语言,基于hx711的51单片机电子秤设计

热门文章

  1. 一个关于导出excel模板的实例
  2. win7 部署tomcat
  3. ListBox类似组件,鼠标右键点击事件得到选中Item
  4. C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
  5. macbook图形化编程_如何判断MacBook使用的是哪种图形芯片(并进行切换)
  6. html中怎么获取搜索框中的值,百度API 搜索框,获取相应的地点的uid
  7. Centos 安装配置 vsftpd
  8. 章鱼黑的第一篇博客~
  9. 3. 视图数据View Data和Balde模版 - Laravel从零开始教程
  10. 视图加载时自动执行铵钮事件