并发,并行和异步方法有什么区别?

Gur*_*epS 143 concurrency multithreading asynchronous

并发是在不同的线程上并行运行两个任务.但是,异步方法并行运行,但在同一个线程上运行.这是如何实现的?那么,并行性呢?

这3个概念之间有什么区别?

Laz*_*rus 117

并发和并行实际上与您正确猜测的原理相同,两者都与同时执行的任务有关,尽管我会说并行任务应该是真正的多任务处理,"同时"执行,而并发可能意味着任务共享执行线程,但仍然表现为并行执行.

异步方法与前两个概念没有直接关系,异步用于表示并发或并行任务的印象,但实际上异步方法调用通常用于需要远离当前应用程序工作的进程,我们不要我想等待并阻止我们的应用程序等待响应.

例如,从数据库获取数据可能需要一些时间,但我们不希望阻止我们的UI等待数据.异步调用接受回调引用,并在请求与远程系统一起发送后立即将执行返回给您的代码.当远程系统执行所需的任何处理时,您的UI可以继续响应用户,一旦将数据返回到您的回调方法,该方法就可以根据需要更新UI(或更新切换).

从用户的角度来看,它看起来像多任务,但可能不是.


编辑

可能值得补充的是,在许多实现中,异步方法调用将导致线程被旋转,但它并不重要,它实际上取决于正在执行的操作以及如何将响应通知回系统.

  • 我认为你的第一段中有并行性和并发性.并发性是指管理多个执行线程,其中并行性更具体地说是多个执行线程同时执行.并发性是一个更广泛的术语,它可以包含并行性. (27认同)
  • 虽然这两个词非常相似并且可能会混淆(并且经常是),但它们确实有不同的定义:并发=同时存在,发生或完成.并行=由或相关于同一或不同设备一次多于一个操作的表观或实际性能.正如您所看到的,并行并不一定意味着并发,但可能只是看起来并发.在一天结束时,这些单词通常可以互换使用,***dev是一个你可能会得到的房间*n + 1*定义;) (7认同)
  • 错误.在编程环境中,并发性是指代码能够"组合"成可以*同时运行的逻辑位的能力.并行性(当与并发性结合时)正在获取所述代码并在100核机器上运行它. (4认同)
  • 我还认为你混淆了并发性和并行性。并行计算同时发生。(我不知道你怎么想,但我从未见过多核 CPU 宣传其“并发”执行能力——它们总是谈论并行执行。)并发 CPU 只是重叠。我不确定异步与并发有何不同。 (3认同)
  • @Mehrdad如果你打算将字典词的定义建立在营销材料中,那么我认为你可能会发现自己处于劣势. (3认同)
  • @FrankRadocaj 说得对。并发意味着程序可以分成多个单元(单元本质上是线程),这些单元可以以任何顺序运行并具有确定的结果。并行意味着这些单元/线程在多个处理器上同时运行。 (3认同)

Vip*_*ain 78

简而言之,

并发意味着在重叠的时间段内以无特定顺序启动,运行和完成的多个任务.并行性是指多个任务或单个任务的几个部分同时运行,例如在多核处理器上运行.

请记住,并发和并行不是一回事.

并发与并行之间的差异

现在让我们列出并发和并行之间的显着差异.

并发是指两个任务可以在重叠的时间段内启动,运行和完成.并行性是指任务在同一时间运行,例如.在多核处理器上.

并发性是独立执行进程的组合,而并行性是(可能相关的)计算的同时执行.

并发性是指同时处理大量事物.并行性是指同时做很多事情.

应用程序可以是并发的 - 但不是并行的,这意味着它同时处理多个任务,但没有两个任务在同一时刻执行.

应用程序可以是并行的 - 但不是并发的,这意味着它可以同时处理多核CPU中任务的多个子任务.

应用程序既不能并行也不能并发,这意味着它可以按顺序一次处理所有任务.

应用程序既可以并行也可以并发,这意味着它可以同时在多核CPU中同时处理多个任务.

并发

当我们讨论最少两个或更多任务时,并发性基本上是适用的.当应用程序能够同时虚拟地执行两个任务时,我们将其称为并发应用程序.虽然这里的任务运行看起来像是同时的,但基本上它们可能不会.它们利用操作系统的CPU时间切片功能,其中每个任务运行其任务的一部分,然后进入等待状态.当第一个任务处于等待状态时,CPU被分配给第二个任务以完成它的任务.

因此,基于任务优先级的操作系统分配CPU和其他计算资源,例如存储器; 轮流转向所有任务并给予他们完成的机会.对于最终用户,似乎所有任务都是并行运行的.这称为并发.

排比

并行性不需要存在两个任务.它实际上是通过为每个任务或子任务分配一个核心来物理运行部分任务或多个任务,同时使用CPU的多核基础结构.

并行性要求硬件具有多个处理单元.在单核CPU中,您可能获得并发但不是并行性.

异步方法

这与并发和并行性无关,异步用于表示并发或并行任务的印象,但实际上异步方法调用通常用于需要远离当前应用程序工作的进程,我们不希望等待并阻止我们的应用程序等待响应.

  • 很有帮助。谢谢 (2认同)
  • @Moondra 异步任务在单个线程上运行,与多线程无关。异步任务将任务发送到应用程序外部的外部进程...即数据库、文件读取器...这些是 IO 进程,然后在进程上添加回调以在 IO 进程完成时执行操作。我不确定的是,某些编程语言中有一些“异步”功能,当您调用异步任务时,它们会创建一个单独的新线程,我听说 C# 就是其中之一,但我对此不确定 (2认同)

Dim*_*mos 44

并发是指多个任务的执行交错​​,而不是每个任务一个接一个地顺序执行.

并行性是指这些任务实际上是并行执行的.

在此输入图像描述


异步是一个单独的概念(即使在某些情况下相关).它指的是一个事件可能在另一个事件的不同时间(不同步)发生.下图说明了同步和异步执行之间的区别,其中actor可以对应于不同的线程,进程甚至服务器.

在此输入图像描述

在此输入图像描述

  • 您对并发的定义是错误的。并发既不意味着非并行也不意味着并行,它只是意味着能够将程序分成多个部分并任意重新排序,因此每个部分都可以由单独的线程运行,但这并没有说明运行是否并行。并发是关于“同时处理很多事情”,并行是关于处理“同时做很多事情”。“__并发_允许_并行”__:[维基百科](https://en.wikipedia.org/wiki/Concurrency_(computer_science)) (10认同)
  • 简单有效的插图. (3认同)
  • 所以异步主要是关于阻塞和非阻塞 (3认同)
  • 并发和异步一样吗? (2认同)
  • 这两个概念确实非常接近,但并不相同。在实践中,异步更多地与动作之间的交互(比如 A 和 B)相关,其中一个 (B) 由另一个 (A) 触发,以及第二个是否会等待第一个完成。并发是一个更通用的术语,用于表示也可以彼此无关的动作,无论它们是按顺序执行还是交错执行。 (2认同)

小智 15

每个人都无法将异步与并行或并发相关联,因为异步不是并行或并发的反义词.它是Synchronous的反义词.这只是表明某些东西(在本例中是线程)是否与其他内容同步,在这种情况下是另一个线程.


Dhi*_*tam 13

并发意味着同时执行多个任务,但不一定同时执行。当您必须执行多项任务但只有一个资源时,我们会选择并发。在单核环境中,并发是通过上下文切换来实现的。

并行就像同时执行多项任务,就像你可以一起唱歌和洗澡。现在您正在并行执行任务。

术语异步与线程执行有关。在异步模型中,当一个任务被执行时,您可以切换到另一个任务,而无需等待前一个任务完成。

异步编程帮助我们实现并发。多线程环境中的异步编程是实现并行性的一种方式。


Eva*_* AB 7

这里有一些语义需要澄清:

并发或并行是资源争用的问题,而异步是关于控制流的问题

当处理顺序没有确定性实现时,不同的过程(或其组成操作)被称为异步;换句话说,它们中的任何一个都有可能在任何给定时间 T 被处理。根据定义,多个处理器(例如 CPU 或人)可以同时处理其中的多个;在单个处理器上,它们的处理是交错的(例如线程)。

当异步过程或操作共享资源时,它们被称为并发;并发性是指在任何给定时间 T 发生争用的明确可能性。当没有共享资源(例如不同的处理器和存储)时,并行性是微不足道的。否则必须解决并发控制问题。

因此,异步过程或操作可以与其他过程或操作并行或同时处理。


jea*_*sti 6

并行:这是一个广义的术语,意味着两段代码“同时”执行。无论它是“真正的”并行性还是通过某种巧妙的设计模式伪造的,都无关紧要。关键是您可以同时启动“任务”,然后分别控制它们(使用互斥体和所有适当的技巧)。但通常您更喜欢仅将“并行”一词用于“真正的”并行性,例如:您通过非合作多任务处理(无论是通过 CPU/GPU 内核,还是仅在软件级别通过让操作系统管理它)来实现它处于非常低的水平)。人们不愿意仅仅因为伪造并行性的复杂顺序代码而说“并行”,就像您在浏览器窗口的 javascript 中看到的那样。因此,这个帖子中的人说“异步与并行性无关”。确实如此,但不要混淆它们。

并发:没有并行性就不可能有并发(无论是模拟的还是真实的,正如我上面所解释的),但是这个术语特别关注这样一个事实:两个系统将在某个时刻尝试同时访问相同的资源。它强调了这样一个事实:你将不得不处理这个问题。

异步:每个人都说异步与并行性无关,但它为并行性铺平了道路(让事情并行或不并行的负担在于您 - 继续阅读)。

“异步”是指并行性的一种表示形式,它形式化了并行性中通常涉及的三个基本内容:1)定义任务的初始化(例如它何时开始以及它获取什么参数),2)完成后必须做什么以及3)代码在中间应该继续做什么。

但它仍然只是语法(通常表示为回调方法)。在幕后,底层系统可能只是简单地认为这些所谓的“任务”只是要堆积起来的代码片段,直到它完成当前正在执行的代码。然后将它们一一展开并按顺序执行。或不。它还可能为每个任务创建一个线程并并行运行它们。谁在乎?该部分不包含在概念中;)


rah*_*dev 6

在几种情况下可能发生并发:

异步 —这意味着您的程序执行非阻塞操作。例如,它可以通过HTTP发起对远程资源的请求,然后在等待接收响应的同时继续执行其他任务。这有点像您发送电子邮件,然后继续生活而无需等待响应。

并行性 -这意味着您的程序通过将工作分解为任务来利用多核计算机的硬件来同时执行任务,每个任务都在单独的内核上执行。有点像在洗澡时唱歌:实际上,您实际上在同时做两件事。

多线程 —这是一种软件实现,允许同时执行不同的线程。即使多线程程序在单核计算机上运行,​​它似乎也同时在执行多项操作。这有点像通过各种IM窗口与不同的人聊天;尽管实际上是来回切换,但最终结果是您同时进行多个对话。

  • 这些都是非常好的类比!谢谢。可以用多线程定义来定义并发性吗?那么并发=单核上的多线程,看起来像是同时发生,但实际上来回切换得非常快? (5认同)

Ped*_*hat 6

“同步和异步是编程模型。并发和并行是执行任务的方式......”。来源:https : //medium.com/better-programming/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66

换句话说,同步和异步描述了你的程序在进行函数调用时如何执行(它会等待还是继续执行?),而并发和并行描述一个函数(任务)将如何执行(并发=可能在同时,并行 = 同时有效执行)。

  • 这是引用,因此是来源。这里的大多数答案都不是由任何领域的权威撰写的,作者给出的解释已经足够好了。 (4认同)
  • 任何人都可以在这里写任何东西,我不知道你为什么选择 Medium。不管怎样,我是一名专业程序员,我赞同这种理解。我发现它很优雅,因为它相对较短。 (3认同)
  • 媒介不是来源,它是其他人谈论他/她对某个主题的(错误)理解的文章,并不使他/她成为权威。 (2认同)

Ala*_*lan 6

用类比来解释这些术语。

你的房子需要洗碗和洗衣服。

并发性:您不必等到完成一个任务才开始另一个任务。例如,您可以先启动菜肴,也可以同时启动两个菜肴。它们可以按任何顺序完成,即即使您先洗碗,也可能先洗衣服。

并行性:家里有不止一个人在做这项工作;举个例子,你可以洗碗,另一个人可以洗衣服。

异步:你告诉某人洗衣服,然后告诉某人洗碗。他们实际上可以是同一个人(即你告诉他们洗衣服,然后立即告诉他们洗碗)。当他们完成每一项工作后,他们会向您报告。

同步:你告诉某人洗碗。你等着他们。当他们完成后,你可以做其他事情(你可以告诉他们接下来洗衣服,或者你可以自己洗,或者你可以完全做其他事情;重点是你在完成第一个任务时被阻止,你与他们同步)。


SW *_*V07 5

并发

并发意味着应用程序同时(同时)在多个任务上取得进展。好吧,如果计算机只有一个 CPU,则应用程序可能不会同时在多个任务上取得进展,但在应用程序内部一次处理多个任务。在开始下一项任务之前,它不会完全完成一项任务。

并行性

并行意味着应用程序将其任务拆分为更小的子任务,这些子任务可以并行处理,例如在多个 CPU 上同时处理。

并发与并行详解

如您所见,并发性与应用程序如何处理它所处理的多个任务有关。应用程序可以一次(顺序)处理一项任务,也可以同时(并发)处理多项任务。

另一方面,并​​行性与应用程序如何处理每个单独的任务有关。应用程序可以从头到尾串行处理任务,或者将任务拆分为可以并行完成的子任务。

如您所见,应用程序可以并发,但不能并行。这意味着它同时处理多个任务,但这些任务不会分解为子任务。

应用程序也可以是并行的,但不能是并发的。这意味着应用程序一次只能处理一个任务,并且该任务被分解为可以并行处理的子任务。

此外,应用程序既不能并发也不能并行。这意味着它一次只处理一个任务,并且该任务永远不会分解为并行执行的子任务。

最后,应用程序也可以是并发和并行的,因为它既可以同时处理多个任务,也可以将每个任务分解为子任务以并行执行。然而,在这种情况下,并发和并行的一些好处可能会失去,因为计算机中的 CPU 已经合理地忙于并发或并行。结合它可能只会导致很小的性能提升甚至性能损失。在盲目采用并发并行模型之前,请务必进行分析和测量。

来自http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html


Sri*_*aru 5

我将让您围绕这些概念进行简短而有趣的介绍。

并发与并行- 执行任务的方式。

举一个现实生活中的例子:有一个挑战,要求你既吃掉一整块大蛋糕,又唱一整首歌。如果你是唱整首歌并完成蛋糕最快的人,你就会赢。因此,规则是你唱歌,吃饭的同时。你怎么做不属于规则。你可以吃完整个蛋糕,然后唱整首歌,或者你可以吃半个蛋糕,然后唱半首歌,然后再唱一遍,等等。

并行是一种特定类型的并发,其中任务真正同时执行。在计算机科学中,并行只能在多核环境中实现。

同步与异步- 编程模型。

在同步中,您将代码编写为从上到下按顺序执行的步骤。在异步编程模型中,您将代码编写为任务,然后并发执行。并发执行意味着所有任务可能同时执行。