Ric*_*dle 1167

并发是指两个或多个任务可以在重叠的时间段内启动,运行和完成.这并不一定意味着它们都会在同一时刻运行.例如,在单核机器上进行多任务处理.

并行时任务字面上的同时运行,例如,在多核处理器上.


引用Sun的多线程编程指南:

  • 并发:当至少两个线程正在进行时存在的条件.一种更通用的并行形式,可以包括时间切片作为虚拟并行的一种形式.

  • 并行性:当至少两个线程同时执行时出现的情况.

  • 我喜欢这个答案,但我可能会更进一步将并发性描述为程序或系统的属性(并行性作为同时执行多个任务的运行时行为). (157认同)
  • 我非常喜欢Adrian Mouat的评论.另见这个出色的解释:http://www.haskell.org/haskellwiki/Parallelism_vs._Concurrency (22认同)
  • @Raj:单核处理器无法实现正确的并行性(在多线程意义上). (8认同)
  • 为此,Sun的引用可以改写为: - 并发:在给定的_period_时间内,两个线程正在进行时存在的条件 - 并行性:当给定特定_point_及时的两个线程时出现的条件正在同时执行 (5认同)
  • 如果Sequential和Parallel都是枚举中的值,那么枚举的名称是什么? (4认同)
  • 不幸的是,“并发”的字面意思是“同时发生”,这也是造成如此多混乱的部分原因。 (3认同)
  • System Threads vs Green Threads http://en.wikipedia.org/wiki/Green_threads (2认同)
  • @toddmo我想您将拥有一个枚举ProgrammingModel {MultiTask,SingleTask}和一个枚举ExecutionModel {Sequential,Parallel}。为了保持一致性,我选择了MultiTask和SingleTask名称,但是MultiTask对我来说是Concurrent的同义词。 (2认同)
  • @Daniel:您仍然需要互斥体,因为线程可以同时运行。处理器可以随时从一个线程切换到另一个线程,包括在一系列指令期间,这些指令只有在变量没有被另一个线程更改时才能工作,例如读/递增/写。 (2认同)

Met*_*hos 429

为什么混乱存在

存在混淆,因为这两个词的字典含义几乎相同:

  • 并发:同时存在,发生或完成(dictionary.com)
  • 平行:非常相似,经常同时发生(merriam webster).

然而,它们在计算机科学和编程中的使用方式却截然不同.这是我的解释:

  • 并发:中断性
  • 并行性:可独立性

那么上面的定义是什么意思呢?

我将用现实世界的比喻来澄清.假设您必须在一天内完成2项非常重要的任务:

  1. 拿到护照
  2. 完成演示

现在,问题是任务-1要求你去一个极端官僚的政府办公室,让你等了4个小时才能拿到你的护照.同时,办公室需要任务2,这是一项关键任务.两者都必须在特定日期完成.

案例1:顺序执行

通常情况下,你将开车到护照办公室2小时,在线等待4个小时,完成任务,开车两个小时,回家,再远离5个小时,完成演示.

案例2:并发执行

但你很聪明.你提前计划.你随身携带一台笔记本电脑,在排队等候时,你开始制作你的演示文稿了.这样,一旦你回到家,你只需要额外工作1小时而不是5小时.

在这种情况下,两个任务都由您完成,只是分片.你在排队等候的时候打断了护照任务并进行了演示.当您的号码被呼叫时,您中断了演示任务并切换到护照任务.由于两个任务的中断性,基本上可以节省时间.

并发,IMO,应该被视为数据库的ACID属性中的"隔离".如果以任何交错方式在每个中执行子事务,并且最终结果与两个任务是按顺序完成相同,则两个数据库事务满足隔离要求.请记住,对于护照和演示任务,您是唯一的刽子手.

案例3:并行执行

现在,既然你是一个聪明的家伙,你显然是一个更高级的,你有一个助手.因此,在您离开开始护照任务之前,您打电话给他并告诉他准备演示文稿的初稿.你花了一整天的时间完成护照任务,回来看看你的邮件,然后找到演示稿.他已经完成了相当可靠的工作,并且在2个小时内进行了一些编辑,你最终确定了它.

既然如此,你的助手就像你一样聪明,他能够独立工作,而不需要经常要求你澄清.因此,由于任务的可独立性,它们由两个不同的执行者同时执行.

还在我这儿?好的...

案例4:并发但不平行

记住你的护照任务,你必须在排队等候?由于这是您的护照,您的助手不能排队等候.因此,护照任务具有可中断性(您可以在排队等候时停止它,并在稍后调用您的号码时恢复它),但不具有可独立性(您的助手不能代替您等待).

案例5:并行但不并发

假设政府办公室有进入房屋的安全检查.在这里,您必须删除所有电子设备并将其提交给官员,并且他们仅在您完成任务后返回您的设备.

在这种情况下,护照任务既不可独立也不可中断.即使您在排队等候,也无法使用其他设备,因为您没有必要的设备.

同样地,假设演示文稿在数学上具有如此高的数学性能,您需要100%浓度至少5小时.即使您有自己的笔记本电脑,也不能在排队等待护照任务时这样做.

在这种情况下,演示任务是可独立的(您或您的助手可以投入5小时的集中精力),但不可中断.

案例6:并发和并行执行

现在,请说除了将助理分配到演示文稿之外,您还随身携带一台笔记本电脑到护照任务.在排队等候时,您会看到助手已在共享卡组中创建了前10张幻灯片.您通过一些更正发送有关其工作的评论.之后,当你到家时,而不是2小时完成选秀,你只需要15分钟.

这是可能的,因为演示任务具有可独立性(你们中的任何一个都可以做到)和可中断性(你可以停止并稍后恢复).因此,您同时执行了这两个任务,并并行执行了演示任务.

让我们说,除了过于官僚之外,政府办公室也是腐败的.因此,你可以显示你的身份证明,输入它,开始排队等候你的号码,贿赂一个警卫和其他人来保持你的位置,潜行,在你的电话号码被召回之前回来,并恢复等待你自己.

在这种情况下,您可以同时并行执行护照和演示任务.你可以偷偷溜出来,你的位置由你的助手保管.然后你们两个都可以进行演示等.


回到计算机科学

在计算世界中,以下是每种情况的典型示例场景:

  • 案例1:中断处理.
  • 情况2:当只有一个处理器时,由于I/O,所有执行的任务都有等待时间.
  • 案例3:当我们谈论map-reduce或hadoop集群时常常会看到.
  • 案例4:我认为案例4很少见.任务并发但不并行的情况并不常见.但它可能发生.例如,假设您的任务需要访问一个特殊的计算芯片,只能通过处理器1访问.因此,即使处理器-2是空闲的并且处理器-1正在执行某些其他任务,特殊计算任务也不能在处理器-2上进行.
  • 案例5:也很少见,但并不像案例4那么罕见.非并发代码可以是受互斥锁保护的关键区域.一旦启动,它必须执行完成.但是,两个不同的关键区域可以在两个不同的处理器上同时进行
  • 案例6: IMO,关于并行或并发编程的大多数讨论基本上都在谈论案例6.这是并行和并发执行的混合和匹配.

并发和Go

如果你看到为什么Rob Pike说并发性更好,你必须明白原因是.您有一个非常长的任务,其中有多个等待期间,您等待一些外部操作,如文件读取,网络下载.在他的演讲中,他所说的只是,"只是打破这个长时间的顺序任务,这样你就可以在等待的时候做一些有用的事情."这就是为什么他谈论不同组织与各种地鼠.

现在,Go的优势在于通过go关键字和渠道轻松实现这一目标.此外,在运行时中有很好的底层支持来安排这些goroutine.

但基本上,并发性更好的是并发性?

苹果比橘子更受青睐吗?

  • Node.js 事件循环是情况 4 的一个很好的例子。即使处理器 B 有空闲资源,请求 X 也应该由正忙于处理 Y 的处理器 A 处理。如果为 Y 调用 setTimeout,则可以处理 X,那么,超时后 Y 也将结束处理。 (4认同)
  • 值得注意的是“并发”一词的两个定义被放入接受的答案中,而这个定义非常**不同**。第一个是指在重叠的时间段内运行多个任务的概念(即并行性默认意味着并发),第二个是指中断一个任务以运行其他任务的概念。 (3认同)
  • 换句话说:并发是系统(线程、程序、语言)停止(挂起)执行一个任务、开始执行第二个任务、完成或挂起第二个任务的执行并继续执行第一个任务的能力, ETC... 。并行是同时(并行)执行这两个任务。接近吗? (2认同)

asf*_*fer 237

我喜欢Rob Pike的演讲:并发不是并行(它更好!) (幻灯片) (谈话)

Rob经常谈论Go,并且通常以直观和直观的方式解决并发与并行的问题!这是一个简短的总结:

任务:让我们烧掉一堆过时的语言手册!一次一个!

任务

并发:任务同时分解很多!一个例子:

地鼠

并行性:如果至少有2个gophers同时工作,则先前的配置会并行发生.

  • 对不起,不得不为"它更好"的位投票.正确的答案是,它是不同的.并发是问题的一部分.并行性是解决方案的一部分. (13认同)
  • 有关视频,请参阅https://blog.heroku.com/archives/2013/2/24/concurrency_is_not_parallelism (9认同)
  • @asfer并发是问题结构的一部分.顺便说一句,不要将"并发"(问题)与"并发控制"(一种经常与并行性一起使用的解决方案)混为一谈. (4认同)
  • 我看了它,说实话我不喜欢它。它给一些应该用更简单的方式解释的事情增加了不必要的复杂性和书呆子气(在这里查看杂耍者的答案)。 (3认同)

Tho*_*s T 137

添加其他人说的话:

并发性就像让一个变戏法者玩弄很多球.无论看起来如何,这个变戏法者每次只能抓住/投掷一个球.平行主义让多个变戏法者同时玩弄球.

  • @thebugfinder,以确保托马斯的例子中没有更多的错误空间.并发就像一个只用一只手玩杂耍的人.无论看起来这个人一次最多只拿一个球.平行主义是变戏法者用双手的时候. (48认同)
  • 我会很挑剔,但如果你在玩一对球,你可以同时有两个球(取决于你如何玩杂耍)。 (3认同)
  • 我认为“平行是每个球都有一个人”更好。如果球的数量增加(想象一下 Web 请求),这些人就可以开始玩杂耍,使执行并发和并行。我也希望有人可以用杂耍的例子来解释反应堆模式.. (2认同)

Pit*_*kos 109

假设你有一个有两个线程的程序.该程序可以以两种方式运行:

Concurrency                 Concurrency + parallelism
(Single-Core CPU)           (Multi-Core CPU)
 ___                         ___ ___
|th1|                       |th1|th2|
|   |                       |   |___|
|___|___                    |   |___
    |th2|                   |___|th2|
 ___|___|                    ___|___|
|th1|                       |th1|
|___|___                    |   |___
    |th2|                   |   |th2|
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我们都有并发性,因为我们有多个线程在运行.

如果我们在具有单个CPU内核的计算机上运行此程序,则操作系统将在两个线程之间切换,允许一次运行一个线程.

如果我们在具有多核CPU的计算机上运行该程序,那么我们将能够并行运行两个线程- 在同一时间并排运行.

  • 我喜欢线程块。简单而完美!感谢您提供如此惊人的答案。 (2认同)

Raj*_*pal 48

并发:如果单个处理器解决了两个或更多问题. 替代文字

并行性:如果多个处理器解决了一个问题.

替代文字

  • 我不同意这一点 - 一个旨在并发的程序可能会或可能不会并行运行; 并发性更多是程序的一个属性,执行时可能会出现并行性. (54认同)

sac*_*tiw 36

我将尝试用一个有趣且易于理解的例子来解释.:)

假设一个组织组织一个国际象棋锦标赛,其中10名球员(具有相同的国际象棋比赛技巧)将挑战职业冠军棋手.因为国际象棋是1:1的比赛,所以组织者必须以时间有效的方式进行10场比赛,以便他们能够尽快完成整个赛事.

希望以下场景可以轻松描述进行这10款游戏的多种方式:

1)SERIAL - 让我们说专业人士一个接一个地与每个人一起玩,即用一个人开始和完成游戏,然后用下一个人开始下一个游戏,依此类推.换句话说,他们决定按顺序进行比赛.因此,如果一场比赛需要10分钟才能完成,那么10场比赛将需要100分钟,同时假设从一场比赛转换到另一场比赛需要6秒,然后10场比赛将是54秒(约1分钟).

所以整个活动大约在101分钟内完成(最糟糕的方法)

2)CONCURRENT - 让我们说专业人员轮到他并转移到下一位玩家所以所有10名玩家同时玩,但专业玩家不是一次两个人,他轮到他并转向下一个人.现在假设职业球员需要6秒才能轮到他,并且职业球员的转换时间为两个球员,而且两名球员的转换时间为6秒,因此回到第一位球员的总转换时间将是1分钟(10x6秒).因此,当他回到第一个人,事件开始时,已经过了2分钟(10xtime_per_turn_by_champion + 10xtransition_time = 2mins)

假设所有玩家需要45秒完成他们的转弯,所以基于SERIAL事件的每场比赛10分钟,没有.比赛结束前的轮数应为600 /(45 + 6)= 11轮(约)

所以整个事件将在11xtime_per_turn_by_player _&_ champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20.35mins(约)完成

从101分钟到20.35分钟进行改进(更好的方法)

3)PARALLEL - 让组织者获得一些额外的资金,因此决定邀请两名职业冠军球员(两名同样有能力)并将两组相同的10名球员(挑战者)分成两组,每组5名,并分配给两名冠军,即一名每组.现在事件正在这两组中并行进行,即至少有两名球员(每组一名)与他们各自组中的两名职业球员比赛.

但是在团队中,专业玩家一次只能拿一个玩家(即顺序),所以在没有任何计算的情况下,您可以很容易地推断出整个事件将在101/2 = 50.5分钟内完成大约完成

从101分钟到50.5分钟看到改进(好的方法)

4)CONCURRENT + PARALLEL - 在上面的场景中,假设两名冠军球员将同时与各自组中的5名球员一起比赛(阅读第2分),所以现在各组之间的比赛并行运行,但在组内他们同时运行.

因此,一组中的游戏将在11xtime_per_turn_by_player _&_ champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930sec = 15.5mins(近似)中大致完成

因此整个事件(涉及两个这样的并行运行组)将在15.5分钟内完成

从101分钟到15.5分钟进行改进(最佳方法)

注意:在上面的场景中,如果用10个类似的作业替换10个玩家,用两个CPU核心替换两个专业玩家,那么下面的顺序将保持不变:

SERIAL> PARALLEL> CONCURRENT> CONCURRENT + PARALLEL

(注意:此顺序可能会因其他方案而改变,因为此排序高度依赖于作业的相互依赖性,通信需要黑白作业和转换开销黑白作业)

  • 很棒的解释.还有一个补充.第二种情况的同时模型(当一名职业球员移动黑白球员时)只有在45秒内球员轮到他时才会得到改善.换句话说,我们应该在整个过程中等待I/O. 如果普通玩家可以在不到45秒(5秒或可能是10秒)内转弯,那么改进将会更少.因此,如果我们的工作中没有I/O等待时间,并发性将与串行执行大致相同. (2认同)

Sau*_*are 30

简单的例子:

同时是:"两个队列访问一台ATM机"

并行是:"两个队列和两台ATM机"


Mih*_*der 27

concurency:具有共享资源潜力的多个执行流程

例如:两个线程竞争I/O端口.

paralelism:将问题分成多个相似的块.

例如:通过在文件的每一半上运行两个进程来解析大文件.


JP *_*oto 26

他们解决不同的问题.并发解决了CPU资源稀缺和许多任务的问题.因此,您可以通过代码创建线程或独立的执行路径,以便在稀缺资源上共享时间.直到最近,由于CPU可用性,并发性一直占据讨论的主导地位.

并行性解决了找到足够的任务和适当的任务(可以正确拆分的任务)并在丰富的CPU资源上分配它们的问题.并行性一直存在,但它已经走到了前列,因为多核处理器非常便宜.


小智 18

并发编程执行有两种类型:非并行并发编程和并行并发编程(也称为并行).

关键的区别在于,对于人眼来说,非并行并发中的线程似乎同时运行,但实际上并非如此.在非并行并发线程中,快速切换并轮流使用处理器通过时间切片.虽然并行性有多个处理器可用,但多个线程可以同时在不同的处理器上运行. 在此输入图像描述

参考:编程语言中的并发简介

  • 一张价值一千字的图片 (7认同)

Ram*_*usa 15

想象一下,通过观看视频教程来学习新的编程语言.您需要暂停视频,应用代码中所说的内容然后继续观看.这是并发性的.

现在你是一名专业程序员.而且您喜欢在编码时聆听平静的音乐.这就是并行性.

请享用.


nab*_*ter 13

并行性是在一个multiple cores per CPU或多个上同时执行进程multiple CPUs (on a single motherboard).

并发是指通过使用分配 CPU时间(时间片)的调度算法实现并行性.进程是交错的.single core/CPU

单位:

  • 单个CPU中的1个或多个内核(几乎所有现代处理器)
  • 主板上有1个或多个CPU (想想旧式学校服务器)
  • 1个应用程序是1个程序(想想Chrome浏览器)
  • 1个程序可以有1个或多个进程(认为​​每个Chrome浏览器选项卡都是一个进程)
  • 1个进程可以有1个程序中的1个或多个线程(Chrome选项卡在1个线程中播放Youtube视频,另一个线程为评论部分生成,另一个用于用户登录信息)
  • 因此,1个程序可以有1个或多个执行线程
  • 1个进程是thread(s)+allocated memory resources by OS (堆,寄存器,堆栈,类内存)

  • 这个答案应该是公认的答案,而不是上面和下面的哲学 (3认同)
  • 我认为这是计算机科学界的完美答案。 (2认同)
  • 不过这个答案是部分错误的,并行性是实现并发的一种方式。异步运行时是另一个。甚至还有多线程异步运行时。“并发”一词并不意味着单个核心/CPU。 (2认同)

Ami*_*ena 12

如果你想向一个 9 岁的孩子解释这一点。

在此输入图像描述


uzl*_*xxx 12

并发性

\n

Rob Pike在他的“并发不是并行”演讲中将并发定义为同时处理很多事情

\n

以在单个 CPU 上执行的三个任务\xc2\xb9 T1、T2 和 T3 为例。

\n

在单个 CPU 核心上同时运行三个任务

\n

在每个时间点(如绿色垂直线所示),CPU 都运行单个任务,即 T1 运行一段时间,然后是 T2,然后是 T1,然后是 T3,依此类推。然而,任务之间的上下文切换发生得如此之快,以至于对于人类观察者来说,CPU 似乎同时执行三个任务。实际上,任务正在取得进展(如灰色水平线所示),即使在任何给定时间点 CPU 正在执行单个任务。所有任务执行都是交错的,因此是并发执行的。在现代操作系统(3E)中,Tanenbaum 将其称为伪并行

\n

现在我们有三个任务,它们被建模为在单个 CPU 上同时运行。如果我们有三个 CPU 核心而不是一个,会发生什么?这就是并行性发挥作用的地方。

\n

并行性

\n

Pike 将并行定义为同时做很多事情。并行性是并发性的一个子集,它是由硬件启用的,其中不仅所有任务都在取得进展,而且它们同时执行。

\n

例如,如果我们有三个 CPU 核心,并将之前的每个任务放置在单独的 CPU 核心上,那么它们将彼此并行执行。

\n

三个任务并行执行

\n

每个CPU核心都在执行一个任务,并且在没有上下文切换的情况下一直继续执行它,因此所有三个任务实际上是同时执行的。当T1在做某事时,T2和T3也在做某事。同样,T1、T2 和 T3 是并行执行

\n

现在并发和并行并不是相互排斥的,你也可以有并行并发

\n

并行并发

\n

并行并发正在多个 CPU 上的多个任务上取得进展(看似同时)。假设我们只有两个 CPU 核心,但保持与以前相同的任务数量,那么一种可能的配置是两个任务在一个 CPU 核心上执行,另一个任务在另一个 CPU 核心上执行。

\n

三个任务并行并发执行

\n

在此示例中,任务 T1 和 T3 在第一个 CPU 上彼此并发执行,而任务 T2 相对于 T1 或 T3 完全并行运行。为什么不是T1T3呢?因为第一个 CPU 在任何给定时间都执行单个任务。因此,T2 在某个时间点与 T1 并行运行,然后 T2 与 T3 并行运行,依此类推。

\n

概括

\n
    \n
  • 并发是指同时处理很多事情,并行性是指同时处理很多事情

    \n
  • \n
  • 并行性是并发性的一个子集。如果任务没有分解为在单个 CPU 上同时运行,那么它们就不可能并行运行。即使有可用的硬件来启用它。

    \n
  • \n
  • 除非硬件启用,否则不存在并行性。如果您没有多个 CPU 核心,则无法并行执行并发任务。

    \n
  • \n
  • 并发和并行并不相互排斥,也不需要同时存在。一个应用程序可以是

    \n
      \n
    • 并发但不是并行,例如分解为并发任务但只有一个CPU。
    • \n
    • 并行但不是并发,例如,任务的数量等于CPU核心的数量,因此每个任务彼此并行运行。
    • \n
    • 并发和并行,例如,它被分解为并发任务,但没有足够的 CPU 核心来处理每个单独的任务。
    • \n
    • 既不是并发也不是并行,例如,单个 CPU 核心,并且应用程序不会分解为单独的并发任务。
    • \n
    \n
  • \n
\n
\n

\xc2\xb9 我使用“任务”一词来指代进程和线程。

\n


yoA*_*ex5 11

并发与并行

Rob Pike 在“并发不是并行”中

并发是关于同时处理很多事情。

并行是关于同时做很多事情。

【并发理论】

并发 - 一次处理多个任务
并行 -一次处理多个线程

我对并发和并行的看法

[同步​​与异步]


MBK*_*MBK 9

并发 =>在具有共享资源的重叠时间段内执行多个任务(可能最大化资源利用率).

Parallel =>当单个任务被分成多个可以同时执行的简单独立子任务时.


小智 9

可以将其视为服务队列,其中服务器只能为队列中的第一个作业提供服务.

1个服务器,1个作业队列(5个作业) - >没有并发,没有并行性(只有一个作业正在服务完成,队列中的下一个作业必须等到服务作业完成且没有其他服务器到服务吧)

1个服务器,2个或更多不同的队列(每个队列有5个作业) - >并发(因为服务器与队列中的所有第一个作业共享时间,相同或加权),仍然没有并行性,因为在任何时刻,只有一个工作正在维修.

2个或更多服务器,一个队列 - >并行(在同一时刻完成2个作业)但没有并发(服务器不共享时间,第三个作业必须等到服务器完成一个.)

2个或更多服务器,2个或更多不同的队列 - >并发和并行

换句话说,并发是共享时间来完成一项工作,它可能需要相同的时间来完成它的工作,但至少它可以提前开始.重要的是,工作可以分成较小的工作,这允许交错.

并行性是通过并行运行的更多CPU,服务器,人员等实现的.

请记住,如果资源是共享的,那么就无法实现纯粹的并行性,但这是并发性最佳实际应用的地方,占用了另一个不需要该资源的工作.


Ben*_*ker 7

我将提供一个与这里的一些流行答案有点冲突的答案.在我看来,并发性是一个包含并行性的通用术语. 并发适用于不同任务或工作单元及时重叠的任何情况. 并行性更具体地适用于在相同物理时间评估/执行不同工作单元的情况.平行主义的存在理由是加速可以从多个物理计算资源中受益的软件.适合并发的另一个主要概念是交互性. 当从外部世界观察到任务的重叠时,交互性适用.互动的存在理由是制作能够响应现实世界实体的软件,如用户,网络同行,硬件外围设备等.

并行性和交互性几乎完全是并发的独立维度.对于特定项目,开发人员可能会关心其中之一,两者都不关心.他们倾向于混淆,尤其是因为线程的憎恶给了两者相当方便的原语.

关于并行性的更多细节:

并行性存在于非常小的规模(例如处理器中的指令级并行性),中等规模(例如多核处理器)和大规模(例如高性能计算集群).由于多核处理器的增长,近年来软件开发人员面临更多线程级并行性的压力越来越大.并行性与依赖性概念密切相关.依赖性限制了并行度的实现程度; 如果一个依赖于另一个任务,则无法并行执行两个任务(忽略推测).

程序员使用许多模式和框架来表达并行性:管道,任务池,数据结构上的聚合操作("并行数组").

关于交互性的更多细节:

进行交互的最基本和最常见的方式是事件(即事件循环和处理程序/回调).对于简单的任务,事件很棒.尝试用事件做更复杂的任务进入堆栈翻录(又名回调地狱;又称控制反转).当你厌倦了事件时,你可以尝试更多奇特的东西,如生成器,协同程序(aka Async/Await)或协作线程.

对于对可靠软件的热爱,如果你想要的是交互性,请不要使用线程.

Curmudgeonliness

我不喜欢Rob Pike的"并发性不是并行性;它更好"的口号.并发性既不比并行性更好也不差.并发性包括交互性,无法以更好/更差的方式与并行性进行比较.这就像说"控制流程比数据更好".


dan*_*gom 7

我真的很喜欢 Paul Butcher对这个问题的回答(他是七周内七个并发模型的作者):

尽管它们经常被混淆,但并行性和并发性是不同的东西。并发是问题域的一个方面——您的代码需要处理多个同时(或接近同时)的事件相比之下,并行性是解决方案领域的一个方面——您希望通过并行处理问题的不同部分使程序运行得更快。有些方法适用于并发,有些适用于并行,有些适用于两者。了解您所面临的问题并为工作选择合适的工具。


s1l*_*3n0 6

在电子串行并行中表示一种静态拓扑,确定电路的实际行为.当没有并发性时,并行性是确定性的.

为了描述动态的,与时间相关的现象,我们使用术语顺序并发.例如,可以通过特定的任务序列(例如,食谱)获得某个结果.当我们与某人交谈时,我们正在制作一系列单词.然而,实际上,许多其他过程在同一时刻发生,因此,与某个动作的实际结果一致.如果很多人同时说话,并发谈话可能会干扰我们的序列,但这种干扰的结果是事先不知道的.并发引入了不确定性.

串行/并行和顺序/并发表征是正交的.这方面的一个例子是数字通信.在串行适配器中,数字消息在时间上(即顺序地)沿着相同的通信线路(例如,一条线路)分布.在并行适配器中,这也在并行通信线路(例如,许多线路)上划分,然后在接收端重建.

让我们想象一个有9个孩子的游戏.如果我们将它们作为链条处理,首先给出一条消息并在结束时接收它,我们将进行串行通信.更多的单词组成了消息,由一系列通信统一组成.

I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....
Run Code Online (Sandbox Code Playgroud)

这是在串行基础设施上重现的顺序过程.

现在,让我们将图像划分为3个组.我们将这个短语分为三个部分,第一个给我们左边的线的孩子,第二个给中心线的孩子,等等.

I like ice-cream so much. > I like    > X > X > X > .... > ....
                          > ice-cream > X > X > X > ....
                          > so much   > X > X > X > ....
Run Code Online (Sandbox Code Playgroud)

这是在并行基础设施上再现的顺序过程(尽管仍然部分序列化).

在这两种情况下,假设孩子之间有完美的沟通,结果是事先确定的.

如果有其他人与您同时与第一个孩子交谈,那么我们将同时进行.我们不知道基础设施将考虑哪个流程,因此最终结果提前确定.


Hop*_*ing 6

我真的很喜欢另一个答案中的图形表示 - 我认为它比上述许多答案更好地回答了这个问题

并行与并发 当两个线程并行运行时,它们同时运行。例如,如果我们有两个线程 A 和 B,那么它们的并行执行将如下所示:

CPU 1:A ------------------------->

CPU 2:B ------------------------->

当两个线程并发运行时,它们的执行会重叠。重叠可以通过以下两种方式之一发生:线程同时执行(即并行执行,如上所述),或者它们的执行在处理器上交错执行,如下所示:

CPU 1:A -----------> B ----------> A -----------> B -------- -->

因此,就我们的目的而言,并行性可以被认为是并发的一种特殊情况

来源:这里的另一个答案

希望有帮助。


Ric*_*ick 6

来自Robert Love的《Linux 系统编程》一书:

并发、并行和竞争

线程创建了两个相关但截然不同的现象:并发性和并行性。两者都是苦乐参半,涉及线程的成本及其好处。并发是两个或多个线程的在重叠的时间执行能力周期并行性同时执行两个或多个线程的能力。并发可以在没有并行的情况下发生:例如,单处理器系统上的多任务处理。并行性(有时强调为 真正的并行性) 是一种特定形式的并发,需要多个处理器(或能够支持多个执行引擎的单个处理器,例如 GPU)。通过并发,多个线程向前推进,但不一定同时进行。通过并行,线程实际上是并行执行的,允许多线程程序使用多个处理器。

并发是一种编程模式,一种解决问题的方式。并行是一种硬件特性,可以通过并发来实现。两者都很有用。

这种解释与接受的答案一致。实际上,这些概念比我们想象的要简单得多。不要认为它们是魔法。并发大约是一段时间,而并行大约是在同一时间同时进行


小智 5

并发性是并行性的一般形式.例如,并行程序也可以被称为并发,但反向不是真的.

  1. 可以在单个处理器上同时执行(多个线程,由调度程序或线程池管理)

  2. 在单个处理器上但在多个处理器上不能并行执行.(每个处理器一个进程)

  3. 分布式计算也是一个相关的主题,它也可以称为并发计算,但反之则不行,如并行性.

有关详细信息,请阅读本研究论文 "并发编程概念"


Bra*_*vic 5

“并发”是指有多个事情同时进行

“并行”是指并发的事情同时进行。


无并行性的并发示例:

  • 单核上的多个线程。
  • Win32 消息队列中的多条消息。
  • MARSSqlDataReader连接上有多个s 。
  • 浏览器选项卡中的多个 JavaScript承诺

但请注意,并发性和并行性之间的差异通常是视角问题。从执行代码(的可观察效果)的角度来看,上述示例是非并行的。但即使在单核内也存在指令级并行性。有些硬件与 CPU 并行工作,然后在完成后中断 CPU。当您执行窗口过程或事件处理程序时,GPU 可能会绘制到屏幕上。当您仍在获取上一个查询的结果时,DBMS 可能正在遍历 B 树以进行下一个查询。浏览器可能会在Promise.resolve()执行时进行布局或联网。等等等等..

所以就这样吧。世界一如既往地混乱;)


Dan*_*tar 5

在我看来,理解这两者的最简单、最优雅的方式就是这样。并发允许交错执行,因此会产生并行的错觉。例如,这意味着并发系统可以在您用 Word 编写文档的同时运行您的 Youtube 视频。底层操作系统是一个并发系统,使这些任务能够交错执行。由于计算机执行指令的速度如此之快,这给人一种同时做两件事的感觉。

并行是当这样的事情真的并行。在上面的示例中,您可能会发现视频处理代码在单个内核上执行,而 Word 应用程序在另一个内核上运行。请注意,这意味着并发程序也可以并行!使用线程和进程构建应用程序使您的程序能够利用底层硬件并有可能并行完成。

那为什么不让一切都平行呢?一个原因是因为并发是一种构建程序的方式,是一种促进关注点分离的设计决策,而并行性通常以性能的名义使用。另一个是有些事情从根本上不能完全并行。一个例子是在队列的后面添加两个东西——你不能同时插入两个东西。有些东西必须先走,另一个在后面,否则你会把队列弄乱。虽然我们可以交错这样的执行(因此我们得到一个并发队列),但你不能让它并行。

希望这可以帮助!


Geo*_*son 5

“并发”是指同时做事——任何事情。它们可以是不同的东西,也可以是相同的东西。尽管缺乏公认的答案,但这并不是“看起来同时”。确实是同时的。您需要多个 CPU 内核(使用一台主机内的共享内存或不同主机上的分布式内存)来运行并发代码。同时运行的 3 个不同任务的管道就是一个示例:任务级别 2 必须等待任务级别 1 完成的单元,任务级别 3 必须等待任务级别 1 完成的工作单元。任务级别 2。另一个例子是1个生产者和1个消费者的并发;或多生产者和 1 消费者;读者和作家;等人。

“并行”就是同时做同样的事情。它是并发的,但此外,它是同时发生的相同行为,并且最常见的是在不同数据上发生。矩阵代数通常可以并行化,因为您可以重复运行相同的操作:例如,可以使用相同的行为(总和)但在不同的列上同时计算矩阵的列和。在可用处理器核心之间对列进行分区(拆分)是一种常见策略,以便每个处理器核心处理的工作量(列数)接近相同。分配工作的另一种方法是任务袋,完成工作的工人返回给经理,经理分配工作并动态地获得更多工作,直到所有事情都完成。票务算法是另一个。

不仅仅是数字代码可以并行化。过于频繁的文件可以并行处理。在自然语言处理应用程序中,对于数百万个文档文件中的每一个,您可能需要计算文档中的标记数量。这是并行的,因为您正在计算每个文件的令牌,这是相同的行为。

换句话说,并行是指同时执行相同的行为。并发意味着同时,但不一定是相同的行为。并行是一种特殊的并发,即相同的事情同时发生。

例如,术语将包括原子指令、关键部分、互斥、自旋等待、信号量、监视器、屏障、消息传递、映射缩减、心跳、环、票务算法、线程、MPI、OpenMP。

Gregory Andrews 的著作是这方面的顶级教科书:多线程、并行和分布式编程。


归档时间:

查看次数:

186236 次

最近记录:

5 年,9 月 前