前言

不知你是否曾经下列这些疑问?

  • 并发与并行性有何关系?
  • 什么是同步和异步执行?
  • 如何区分并发与并行?
  • 线程如何与所有这些概念一起使用?

并发

并发性意味着应用程序同时(并发地)在多个任务上取得进展(is making progress )。好吧,如果计算机只有一个CPU,那么应用程序可能不会在同一时间对多个任务进行处理,但是在应用程序内部,同时处理多个任务。在开始下一个任务之前,它不会完全完成一个任务。
让我们举个现实生活中的例子:有个挑战要求你既要吃掉一整块蛋糕,又要唱一整首歌。如果你是最快唱完整首歌并完成蛋糕的人,你就赢了。所以规则是你一边唱歌一边吃东西,你可以吃掉整个蛋糕,然后唱整首歌,或者你可以吃掉半个蛋糕,然后唱半首歌,然后再唱一遍,等等。

并发性意味着同时执行多个任务,但不一定是同时执行。有两个任务同时执行,但它们是在一个单核CPU中运行的,所以CPU会决定先运行一个任务再运行另一个任务,或者先运行一半任务再运行另一半任务等等。两个任务可以在重叠的时间段中启动、运行和完成,任务2甚至可以在任务1完成之前开始。这完全取决于系统架构。

并行

并行是指应用程序将其任务分解为较小的子任务,这些子任务可以并行处理,例如在多个CPU上同时进行。
并行不要求存在两个任务。它实际上是通过使用CPU的多核基础结构,通过为每个任务或子任务分配一个内核来同时实际运行部分任务或多个任务。

如果我们继续上面的示例,则规则仍然是同时唱歌和吃饭,但是这次,你要两个人一起比赛。你可能会吃东西,然后让你的朋友唱歌(因为她唱歌更好,你吃得更好)。所以这一次,这两个任务实际上是同时执行的,称为并行

并行性本质上要求具有多个处理单元的硬件。**在单核CPU中,您可能会获得并发性,但不能并行化。**并行是一种特定类型的并发,其中的任务实际上是同时执行的。

并发和并行的区别是什么?

在《The Art of Concurrency 》一书中介绍说两者的区别是:

A system is said to be concurrent if it can support two or more actions in progress at the same time. A system is said to be parallel if it can support two or more actions executing simultaneously.

翻译过来就是

如果一个系统能够同时支持两个或多个正在进行的操作,则称为并发系统。如果一个系统能够支持两个或多个同时执行的操作,则称为并行系统。

这里面有一个关键词就是in progress正在进行。这个定义是说,在并发系统中多个操作可以同时进行(可能不会执行)。同时,多个操作在并行系统同时执行。事实上,并发性和并行性在概念上在某种程度上是重叠的,但在**进行中(in process)**显然使它们不同。

Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.
并发是指同时处理许多事情。并行性是指同时做很多事情。

关于并发的形象例子

你和你的心上人去肯德基吃汉堡,你们分别点了一个汉堡,付完钱之后,服务员给了你一个号,然后你就和你的心上人找了一个桌子坐下来了,然后你们开始谈情说爱,这个时候肯德基在为你准备着你的汉堡,这时候你们一边等着肯德基服务员的叫号,一边继续谈情说爱,正谈到高兴的时候,叫到你们的号了,你没有立刻去取餐,因为你知道别人没有你的号,不会将你的餐取走,所以等到聊完了,你慢悠悠的去取餐,然后你们一起开心的吃汉堡。

这个你一边等着肯德基的号,一边和心上人聊天的过程就是并发的,你等待取餐和肯德基制作汉堡是异步的(asynchronous ),你在等待的时候还在干其他的事——和你的心上人弹琴说爱,你在同时处理许多事情

关于并行的形象例子:

你和你的心上人去买奶茶,总共有3个窗口可以点奶茶,每个点餐服务员同时也是制作奶茶的服务员,所以没有“取号”的机制,所以你只能排队等在队伍前面的人付款-等待-取完奶茶之后再下单,终于等到你们了,在下单-付款之后,店员去厨房给你们做好奶茶,你们也只能在柜台前面等待着,这样可以保障别人不会将你们的奶茶拿走,由于你和你的心上人忙于不让任何人站在你们面前并在奶茶完成时候带走你们的奶茶,所以你们无心“谈情说爱”。然后经过漫长时间的等待,你们的奶茶终于做好了,你们拿起奶茶,然后你们喝了奶茶就好了。

在这个过程中你和你的心上人都在等待并且将你们的注意力长时间花在“在柜台上等待”,这是同步工作,您与收银员/厨师ok‍**“同步”**,你的等待和厨师的制作奶茶同步。虽然有3个窗口可以点奶茶,他们并行的为消费者提供服务,虽然你们取到奶茶的时间未必很长,但是你们一直都在等待,想必这一定影响你和你心上人的体验。

是否并发一定比并行好?

并发不同于并行。在涉及大量等待的特定情况下,并发效果更好。因此,对于Web应用程序开发,它通常比并行性好得多。但并非所有的情况都是这样的。

总结

  • 一个应用程序可以是并发的,但不是并行的,这意味着它可以同时处理多个任务,但是没有两个任务可以同时执行。
  • 一个应用程序可以是并行的,但不是并发的,这意味着它可以同时处理多核CPU中一个任务的多个子任务。
  • 应用程序既不能是并行的,也不是并发的,这意味着它一次顺序地处理所有任务。
  • 一个应用程序既是并行的,也是并发的,这意味着它可以同时在多核CPU中同时处理多个任务。

参考

Concurrency vs. Parallelism — A brief view

FastApi Asynchronous Code

并发 vs 并行 (Concurrency Is Not Parallelism)相关推荐

  1. Go 学习笔记(22)— 并发(01)[进程、线程、协程、并发和并行、goroutine 启动、goroutine 特点,runtime 包函数]

    Go 语言通过编译器运行时( runtime ),从语言上支持了并发的特性. 虽然 Go 程序编译后生成的是本地可执行代码,但是这些可执行代码必须运行在Go 语言的运行时(Runtime )中.Go ...

  2. 如何给女朋友解释并发与并行的区别?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 现在我们都说设计可并行.高并发的程序,而且我们很多时候会 ...

  3. C#多线程、并发与并行概念

    软件开发,网站开发过程中经常有并发,并行这样的多线程处理与应用.因此,有必要对其进行了解与掌握. 多线程: 在了解线程之前,要先知道进程这个概念.进程是一个具有独立功能的程序关于某个数据集合的一次运行 ...

  4. 转:并发与并行的区别

    转: https://www.jianshu.com/p/b11e251d3dc7 并发:一个处理器同时处理多个任务.(concurrency) 单个cpu逻辑上同时处理多个任务: 并行:多个处理器或 ...

  5. 转一篇关于并发和并行概念的好文,附带大神评论

    转自:https://laike9m.com/blog/huan-zai-yi-huo-bing-fa-he-bing-xing,61/ 还在疑惑并发和并行? OK,如果你还在为并发(concurre ...

  6. C#语法之---多线程、并发与并行概念总结

    转自:http://blog.csdn.net/qq_33290787/article/details/51790605 软件开发,网站开发过程中经常有并发,并行这样的多线程处理与应用.因此,有必要对 ...

  7. 【操作系统】进程、线程、协程和并发、并行

    文章目录 一.并发介绍 1. 进程和线程 (1)进程 (2)线程 (3)进程与线程的区别 (4)任务调度 (5)何时使用多进程,何时使用多线程? 2. 线程和协程 (1)协程 (2)协程和线程的区别 ...

  8. 还在疑惑并发和并行?

    转载自:https://laike9m.com/blog/huan-zai-yi-huo-bing-fa-he-bing-xing,61/ OK,如果你还在为并发(concurrency)和并行(pa ...

  9. 线程并发和并行_并发性,并行性和圣诞老人​​的许多线程

    线程并发和并行 Consider the following: Santa brings toys to all the good girls and boys. 考虑以下几点:圣诞老人为所有好的男孩 ...

最新文章

  1. 微服务架构 为什么需要配置中心
  2. wxWidgets:网格控件 wxWidgets 示例
  3. 十八种方法让你集中精力工作
  4. OO_BLOG3_规格化设计(JML学习)
  5. html动态网页效果代码_教你制作网页的第一步
  6. springBoot的模版引擎
  7. android java 调试快捷键_Android Studio 代码页跳界面 /java和XML快速切换技巧
  8. 中琛源主要的产品是什么
  9. .NET中的异常处理机制(一)
  10. lammps教程:boundary命令详解
  11. 下厨房某词条下的所有图片爬取
  12. 【雕爷学编程】Arduino动手做(76)---2路光耦继电器模块
  13. 面试算法高频压轴题——灯泡开关问题
  14. 2020年茶艺师(初级)考试题及茶艺师(初级)考试题库
  15. 微信升级后不再使用x5内核,debugx5.qq.com打不开,如何开启微信调试?
  16. signature=664f9760ad1f1ac8fb5bff722b4da240,恶意软件分析 URL链接扫描 免费在线病毒分析平台 | 魔盾安全分析...
  17. [Themeda启动器]用Java编写的Minecraft启动器
  18. python调用海康威视工业相机SDK实现图片采集
  19. 【清华集训2017模拟】Catalan
  20. 随机森林预测财务报表是否舞弊

热门文章

  1. aws lambda使用, aws无服务器部署应用。 aws ecr凭证获取和使用。
  2. 2022-2028年中国二次供水产业发展动态及投资战略规划报告
  3. 2021-2027年中国中空纤维膜行业市场研究及前瞻分析报告
  4. 【Sql Server】Database-sql语言的流程控制语句
  5. SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断
  6. starrocks问题小结
  7. 聚类和EM算法——K均值聚类
  8. MLIR Python绑定
  9. CUDA 8的混合精度编程
  10. 个性化排序的神经协同过滤