当前位置: 首页 > news >正文

温故之.NET 中的并行并发概念解析

这篇文章主要讲解并行与并发的概念,以及它们之间的区别与联系

为了说明白并行与并发的区别,我们举了两个例子。我们先看一个例子:一个人干活和多个人干活

例子一:包子铺

并发

假设我们开了一家包子铺,生意特别好,早上的时候人特别多。最开始这个店铺(如同我们的电脑)只有我们一个人打理(一个处理器)。因此,来购买早餐(电脑有任务需要处理)的人都需要排队。就算这样,我们一个小时之内,还是可以卖很多份早餐出去(即在一段时间之内,单个处理器可以处理很多任务)。

这便是并发,它指的是,在一段时间内(注意是一段时间,而不是某个时间点),可处理的任务的数量,它不关注某一个时间点做了多少事情。比如QPS,它指的是一个查询服务器在每秒内能处理的请求数量。这和前面一个小时内卖多少份早餐是一样的

并行

与并发不同,并行指的是,在某个时间点,能处理的任务数量,即它重心在于每个时间点能处理的任务量(或者说处理任务的速度),而不关心一小时内或一分钟内处理的任务量。

比如,随着生意越来越好,人越来越多,一个人根本就忙不过来,所以我们请了三个帮手,加上我们自己,就有四个人可以同时卖早餐了。
假设我们之前一个小时内一个人可以卖 200 个包子,现在有四个人,是不是在一个小时内,差不多就能卖 800 个包子了。
因为在这一个小时内的每一个时间点,差不多都可以卖 4 份早餐出去(之前因为只有一个人,一个时间点只能卖一份)。
这就好比我们的电脑有四个处理器,在同一个时间点,可以处理的任务数量是 4 个。因此,在一秒内,并发量理论上就可以达到之前单个处理的四倍了

例子二:微信运动

微信运动,可以记录我们每天走的步数(可以认为我们每走一步,就是做一个任务)。

假设我们有一个微信运动群(一个电脑)
如果这个群里面只有一个人(一个处理器),那么这个群这一天的步数就是这个人的。即此时群的步数(并发量)由这一个人决定(电脑的并发量由这一个处理器决定)
如果这个群有10个人(10个处理器),那么这个群一天的步数就是这10个人这一天的步数之和了。即并发量由这10个处理器决定
这10个人,各自走着各自的路,而互不影响(并行),但却决定着这一天的步数(并发量)

总结一下

例子归例子,例子只是为了方便我们更好的理解并发、并行的概念,以及它们之间的联系。但实际项目、正式发布的环境中,并发量与并行速度还取决于任务之间的相关性(如线程间数据共享)、磁盘 I/O,网络带宽等等

因此,需要注意以下这些地方

  • 这两个概念表述的重点是不同的。并发指的是一个时间段内能做的事情的数量;并行指的是某一个时间点能处理的事情的数量
  • 并行会影响并发,但并发不仅仅由并行来决定。还有磁盘 I/O,网络带宽等等
  • 一个参与者(即一个处理器),也可以有并发,但却不会有并行。并行需要有至少两个参与者(即两个处理器)

既然这篇文章我们讲的是 .NET 中的并行并发,那自然就会说到任务并行库(TPL)、并行 LINQ (PLINQ)。其中TPL 包含数据并行、任务并行、数据流等概念

任务并行,以任务为基础,来实现多个独立任务的同时运行。这样可以充分的利用系统资源,同时可以更加方便的管理并行中的任务(因为对 Task 我们可以有非常精细的控制)

TPL 在多处理器上具有很明显的性能优势,处理器越多越明显。然而在处理器比较少(比如只有一个)的时候,性能可能反而会有所下降。因此在选择的时候,我们需要根据目标环境(部署的环境)进行权衡

关于.NET 中的并行并发就简要说一下,这篇文章主要以理解并行并发为主。希望我们能够通过这两个例子加深对这两个概念的理解

至此,这篇文章的内容讲解完毕。欢迎关注公众号【嘿嘿的学习日记】,所有的文章,都会在公众号首发,Thank you~

转载于:https://juejin.im/post/5b344bad6fb9a00e973c59cf

相关文章:

  • 命名实体识别从数据集到算法实现
  • 过滤器的功能实现
  • ps:建立规则选区
  • 巴克莱银行聚焦于业务产出的做法
  • Scala学习笔记(1)
  • Ubuntu 下解压tar.xz方法
  • Java深究之String、StringBuffer、StringBuilder的区别
  • 主题 :学习与自我提升
  • php 向关联数组头部插入key value 保持数组关系不变
  • excel导出 ajax错误判断 数据为空判断
  • 分分钟用上C#中的委托和事件
  • python-day2-06-列表
  • 【短文】为什么我不在PHP的私有变量用下划线了?
  • angular-路由与导航部分梳理
  • C# Web Api一个小例子
  • 2017-09-12 前端日报
  • Angular 2 DI - IoC DI - 1
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Bytom交易说明(账户管理模式)
  • centos安装java运行环境jdk+tomcat
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java IO学习笔记一
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java多线程(4):使用线程池执行定时任务
  • JS+CSS实现数字滚动
  • markdown编辑器简评
  • spring学习第二天
  • XML已死 ?
  • 设计模式 开闭原则
  • 深度学习入门:10门免费线上课程推荐
  • 树莓派 - 使用须知
  • 通信类
  • 移动端唤起键盘时取消position:fixed定位
  • 用Visual Studio开发以太坊智能合约
  • Prometheus VS InfluxDB
  • 国内开源镜像站点
  • #NOIP 2014# day.1 T2 联合权值
  • #Spring-boot高级
  • (175)FPGA门控时钟技术
  • (day 12)JavaScript学习笔记(数组3)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (一)Linux+Windows下安装ffmpeg
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Oracle存储过程编写经验和优化措施
  • . Flume面试题
  • .NET Core 2.1路线图
  • .NET Micro Framework初体验(二)
  • .NET 服务 ServiceController
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET委托:一个关于C#的睡前故事
  • .NET运行机制
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • [Android 13]Input系列--获取触摸窗口