一. 并行编程

1. 区分串行编程和串行编程

①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行。(典型代表for循环 下面例子从1-100按顺序执行)

②. 并行编程:充分利用多核cpu的优势,同时开启多个线程并行执行。(典型代表Parallel.For循环 下面例子从1-100无序执行)

代码实践:

 1   {2                 //1. 串行 (从1-100按顺序执行)3                 for (int i = 1; i < 100; i++)4                 {5                     Console.WriteLine(i);6                 }7                 //2. 并行 (从1-100无序执行)8                 Parallel.For(1, 100, (item) =>9                 {
10                     Console.WriteLine(item);
11                 });
12  }

结论:串行的代码按顺序依次输出,并行的代码无顺序输出。

2. 深究Parallel类中的方法 (For方法、ForEach方法、Invoke方法 这三个方法都是用来开启线程的)

(1). Invoke方法

a. 该方法的作用就是用来同时开启多个线程的。

b. 该方法有两个重载,主要涉及到两个参数,用来配置最大并行数(即线程数)和一个可变的Action委托数组(详见源码)。

案例一: 开启五个不同的线程调用五个方法 我们发现一个现象,主线程等着这五个子线程执行完毕后才执行,但是我们并没有写线程等待的代码,所以我们可以总结: ①:并行计算,开启多个线程后,不需要再开辟线程等待,直接是主线程完成后续操作。 ②:而普通多线程执行后,需要单独再开辟一个线程等待,然后主线程在执行。

代码实践:

1                 {
2                     Parallel.Invoke(() => this.TestThread("bct1")
3                                  , () => this.TestThread("bct2")
4                                  , () => this.TestThread("bct3")
5                                  , () => this.TestThread("bct4")
6                                  , () => this.TestThread("bct5")
7                         );
8                 }

编辑切换为居中

添加图片注释,不超过 140 字(可选)

案例二: 指定最大并行数进行线程调用 我们发现,五个任务中的四个任务同时由不同线程开启,当其中一个任务结束时,第五个任务开启,并由刚结束的任务的线程来执行。

                {//设置最大的线程并行数ParallelOptions p = new ParallelOptions();p.MaxDegreeOfParallelism = 4;Parallel.Invoke(p, () => this.TestThread("bct1"), () => this.TestThread("bct2"), () => this.TestThread("bct3"), () => this.TestThread("bct4"), () => this.TestThread("bct5"));}

编辑切换为居中

添加图片注释,不超过 140 字(可选)

(2). For方法 (前两个参数之间的差代表任务的个数)

这里介绍一个简单重载: public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action body);

fromInclusive:开始索引(含).

toExclusive:结束索引(不含).

body:将为每个迭代调用一次的委托.

当然该方法中的其他重载中也有很丰富的功能,比如也可以配置最大线程数。

C/C++Linux服务器开发高级架构师/C++后台开发架构师免费学习地址

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取

代码实践:

 1  {2                 //案例一:前两个参数之间的差,就为并行计算线程的个数3                 {4                     Parallel.For(5, 10, t =>5                         {6                             //这里的t分别为:5,6,7,8,9 五个数7                             string name = string.Format("bct{0}", t);8                             this.TestThread(name);9                         });
10                 }
11                 //案例二: 配置最大并行数
12                 //结果:同时最多5个线程执行,但是还是要执行9个任务,(6,7,8,9,10,11,12,13,14),后面四个任务等前面的执行完后,再执行
13                 {
14                     ParallelOptions po = new ParallelOptions()
15                     {
16                         MaxDegreeOfParallelism = 5    //表示最大线程数为5,后面即使配置超过5,也无效
17                     };
18                     Parallel.For(6, 15, po, (t, state) =>
19                     {
20                         string name = string.Format("bct{0}", t);
21                         this.TestThread(name);
22                         //state.Break();   //退出单次循环(没看到实际作用)
23                         // state.Stop();     //退出全部循环(没看到实际作用)
24                         //return;
25                     });
26                 }
27             }

(3). ForEach方法

这里也是介绍一个简单的重载:int数组中的个数代表需要进行并行任务的个数,但并不一定所有任务同时执行,也不一定每个任务都是一个新线程执行。

该方法当然也可以配置最大并行数。

代码实践:

 {//数组里的个数,就为并行进行并行任务数Parallel.ForEach(new int[] { 3, 5, 44, 55, 100 }, t =>{//这里的t分别为:3, 5, 44, 55, 100五个数string name = string.Format("bct{0}", t);this.TestThread(name);}
}

二. 常见的编程模型

1.同步编程模型(SPM):单线线程、串行开发模式。

2.异步编程模型(APM):xxxbegin、xxxend的模式。

3.基于事件的编程模型(EAP): xxAsync这样的事件模式。 eg:WebClient。

4.基于Task的编程模型(TAP): APM和EAP都可以使用Task来实现,微软的初衷就是想通过Task大一统异步编程领域。

下面分享两段代码,不做深入研究了。

 1             {2                 FileStream fs = new FileStream(Environment.CurrentDirectory + "//1.txt", FileMode.Open);3                 var bytes = new byte[fs.Length];4                 var task = Task.Factory.FromAsync(fs.BeginRead, fs.EndRead, bytes, 0, bytes.Length, string.Empty);5 6                 var nums = task.Result;7 8                 Console.WriteLine(nums);9             }
10             {
11                 FileStream fs = new FileStream(Environment.CurrentDirectory + "//1.txt", FileMode.Open);
12
13                 var bytes = new byte[fs.Length];
14
15                 fs.BeginRead(bytes, 0, bytes.Length, (aysc) =>
16                 {
17                     var nums = fs.EndRead(aysc);
18
19                     Console.WriteLine(nums);
20
21                 }, string.Empty);
22
23                 Console.Read();
24             }

原文链接:第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)

深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)相关推荐

  1. 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)

    一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...

  2. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  3. Shell-通过shell启动Java类中的main方法 + 通过Shell启动jar包

    文章目录 概述 shell启动Java类中的main方法 启动脚本分析 启动脚本 shell启动jar包 概述 Java程序 运行在linux主机上, 通过shell脚本启动为进程. Java程序中 ...

  4. 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)

    文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...

  5. python extract方法_在多个项目类中使用extract方法

    我不是一个有经验的程序员,不要生我的气- 我正在探索一些小的可能性(我有一些Python编程技巧).在 废弃一个网站:让我们想象一下,我们可以从opengraph(og:)中提取一些信息,比如&quo ...

  6. 17.Java常用实用类之String类中常用的方法以及一般应用场景,final关键字

    文章目录 1.String类学习 1.1.什么是String类 1.2.String类中常用的方法 1.2.1. 构造方法 1.2.2.public int length() 1.2.3.public ...

  7. python中的object是什么意思_Python object类中的特殊方法代码讲解

    python版本:3.8class object: """ The most base type """ # del obj.xxx或del ...

  8. python定义私有变量的方法_Python怎么修改私有属性 如何访问python类中的私有方法...

    python 类为什么不能定义私有属性和方法 因为b.name[0] = 'zhang'修改的是类属性,类属性是全局的,所有的实例共享,如果想私有化,可以添加 def __init__( self ) ...

  9. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object       java.lang.String 所有已实现的接口: Serializable, ...

最新文章

  1. 如何在windows7上安装启明星系统。
  2. ADO.NET常用对象
  3. 登录之图形跟短信验证码
  4. [博客之路]如何增加一个博客的PR值(一)
  5. Java Date的after和before方法解释
  6. Android的Recovery中font_10x10.h字库文件制作
  7. POJ - 1321 棋盘问题
  8. linux环境部署ltmj,Linux系统安装与简单配置 图文.docx
  9. 杨辉三角java代码_【LeetCode】118. 杨辉三角(Pascal#x27;s Triangle)解题思路
  10. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】04、统一处理异常...
  11. vs添加系统环境变量不识别_项目经验不重样!3个基于SpringBoot 的图片识别处理系统送给你...
  12. php设计模式 — 单例模式(singleton)
  13. linux装完系统需要输入密码,在安装Linux系统的过程中,一定要设置root用户的密码 (5.0分)...
  14. 解决nginx设置反向代理后,css|js|gif|jpg|jpeg|png|bmp|swf等静态资源无法加载
  15. xp下安装什么linux系统版本,windows xp sp3下怎么安装linux系统?
  16. Q2净利润同比下降1%,甲骨文转型之路错搭“老爷车”?
  17. 海南信用社计算机试题,2015年海南农村信用社考试试题——计算机基础知识一...
  18. 店铺数据分析很重要吗?分析拼多多数据重要性,店铺引流效果有效提升。
  19. 世界时区: UTC/GMT+08:00 东八区
  20. 简易php代码防止恶意刷新网站

热门文章

  1. python进行各项统计检验_运用python进行相关性统计检验
  2. python跳出两层for_干货 | 收藏!16段代码入门Python循环语句
  3. 咸鱼CAD笔记—2018切换经典模式
  4. android打印服务apk,hp打印服务插件安卓下载
  5. python随机数赋值_怎么让随机数在每次循环后刷新
  6. 医院智能3D蓝牙导航导诊系统
  7. C语言 · 关联矩阵
  8. 设计模式——状态模式(State Pattern)
  9. b站电脑客户端_苹果最强电脑和显示器即将发售 / 央视新闻入驻 B 站 / 淘集集启动破产清算...
  10. 康海系统串口通讯服务器,康海串口服务器608简单设置手册.doc