并发、并行和异步方法有啥区别?

Posted

技术标签:

【中文标题】并发、并行和异步方法有啥区别?【英文标题】:What is the difference between concurrency, parallelism and asynchronous methods?并发、并行和异步方法有什么区别? 【发布时间】:2011-06-18 04:40:57 【问题描述】:

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

这三个概念有什么区别?

【问题讨论】:

“异步”这个词有很多不同的含义。这些术语是相关的,但它们并不描述不相交的事物集。含义重叠并因情况而异。 所以第一个并发是同时运行两个或多个进程。除此之外,并发并不是并行。并行进程需要两个或更多内核,而并发进程可以在时间上共享一个内核。 这几乎是***.com/questions/1050222/… 的复制品,它也有一些很好的答案。不同的是,这个问题询问异步方法,而另一个没有。 【参考方案1】:

并发和并行实际上与您正确猜测的原理相同,两者都与同时执行的任务有关,尽管我会说并行任务应该是真正的多任务,“同时”执行,而并发可能意味着任务正在共享执行线程,同时似乎仍在并行执行。

异步方法与前两个概念没有直接关系,异步用于呈现并发或并行任务的印象,但实际上异步方法调用通常用于需要在当前应用程序之外完成工作的进程而且我们不想等待并阻止我们的应用程序等待响应。

例如,从数据库中获取数据可能需要一些时间,但我们不想阻止我们的 UI 等待数据。异步调用采用回调引用,并在向远程系统发出请求后立即将执行返回给您的代码。当远程系统执行所需的任何处理时,您的 UI 可以继续响应用户,一旦它将数据返回给您的回调方法,那么该方法可以适当地更新 UI(或移交该更新)。

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


编辑

值得补充的是,在许多实现中,异步方法调用会导致线程启动,但这不是必需的,它实际上取决于正在执行的操作以及如何将响应通知回系统。

【讨论】:

我认为您在第一段中混淆了并行性和并发性。并发是指管理多个执行线程,其中并行性更具体地说是多个执行线程同时执行。并发是一个更广泛的术语,可以包含并行性。 虽然这两个词非常相似并且可能会混淆(并且经常混淆),但它们确实有不同的定义:并发 = 存在、发生或同时完成。并行 = 相同或不同设备一次执行多个操作的表观或实际执行的或与之相关的。如您所见,并行并不一定意味着并发,而可能只是看起来是并发的。归根结底,这些词经常可以互换使用,而 n dev 是一个房间,您可能会得到 n+1 个定义;) @Mehrdad 如果您要根据在营销材料中的使用来定义字典单词,那么我认为您可能会发现自己处于某种劣势。 错了。在编程的上下文中,并发是您的代码被“组合”成可以同时运行的逻辑位的能力。并行性(与并发性结合使用时)正在获取所述代码并在 100 核机器上运行它。 @FrankRadocaj 说得对。并发意味着程序可以拆分为单元(单元本质上是线程),这些单元可以按任何顺序运行并具有确定的结果。并行意味着这些单元/线程在多个处理器上同时运行。【参考方案2】:

简而言之,

并发是指在重叠的时间段内开始、运行和完成的多个任务,没有特定的顺序。并行性是指多个任务或一个独特任务的几个部分实际上同时运行,例如在多核处理器上。

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

并发与并行之间的区别

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

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

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

并发是一次处理很多事情。并行就是一次做很多事情。

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

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

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

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

并发

当我们谈论至少两个时,并发本质上是适用的 任务或更多。当应用程序能够执行两个任务时 几乎同时,我们称之为并发应用程序。虽然在这里 任务运行看起来像同时运行,但本质上它们可能不会。 他们利用操作系统的 CPU 时间分片功能 每个任务运行其任务的一部分,然后进入等待状态。 当第一个任务处于等待状态时,CPU 被分配给第二个任务 完成它是任务的一部分。

操作系统基于任务的优先级,从而分配CPU和 其他计算资源,例如记忆;轮流执行所有任务和 给他们完成的机会。对于最终用户来说,似乎所有任务都是 并行运行。这称为并发。

并行性

并行性不需要两个任务存在。从字面上看 同时物理运行部分任务或多个任务 使用 CPU 的多核基础架构,通过为每个内核分配一个内核 任务或子任务。

并行性需要具有多个处理单元的硬件, 本质上。在单核 CPU 中,您可能会获得并发,但不会 并行性。

异步方法

这个和并发和并行无关,使用的是异步 呈现并发或并行任务的印象,但 实际上,异步方法调用通常用于进程 需要在当前应用程序之外进行工作,而我们不需要 想要等待并阻止我们等待响应的应用程序。

【讨论】:

我仍然对异步与并发感到困惑。我见过使用“异步运行任务”和“同时运行任务”的短语。异步运行任务和并发运行任务似乎是同一个意思? @Moondra 异步任务在单线程上运行,与多线程无关。异步任务将任务发送到应用程序外部的外部进程......即数据库,文件阅读器......这些是 IO 进程,然后在进程上添加回调以在 IO 进程完成时执行操作。我不确定的是,某些编程语言中有一些“异步”功能会在您调用异步任务时创建一个单独的新线程,我听说 C# 是其中之一,但我不确定 这个答案似乎抄袭自Lazarus's(“...呈现印象...”)。 答案的其余部分与this page from howtodoinjava.com 相同,但在这种情况下,我无法确定哪个先出现。【参考方案3】:

并发是指多个任务交错执行,而不是每个任务一个接一个地依次执行。

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


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

【讨论】:

简单有效的插图。 并发和异步一样吗? 这两个概念确实非常接近,但并不相同。在实践中,异步与动作(比如 A 和 B)之间的交互更相关,其中一个 (B) 由另一个 (A) 触发,以及第二个是否会等待第一个完成。并发是一个更通用的术语,用于表示彼此之间也可以不相关的操作,无论它们是按顺序执行还是交错执行。 所以异步主要是关于阻塞和非阻塞 你对并发的定义是错误的。并发既不意味着非并行也不意味着并行,它只是意味着能够将程序分成多个部分并任意重新排序它们,因此每个部分都可以由单独的线程运行,但这并没有说明运行并行与否。并发是关于处理“一次做很多事情”,并行是关于处理“一次做很多事情”。 “并发允许并行”:Wikipedia【参考方案4】:

有几种情况会发生并发:

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

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

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

【讨论】:

这些比喻真好!谢谢。可以说并发可以用您的多线程定义来定义吗?所以并发 = 单核上的多线程,看起来它是同时发生的,但它真的来回切换非常快?【参考方案5】:

每个人都很难将异步与并行或并发相关联,因为异步不是并行或并发的反义词。它是同步的反义词。这只是表明某些东西(在这种情况下是线程)是否会与其他东西(在这种情况下是另一个线程)同步。

【讨论】:

【参考方案6】:

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

并行性就像同时执行多个任务,就像您可以一起唱歌和洗澡一样。现在您正在并行执行这些任务。

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

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

【讨论】:

【参考方案7】:

并发

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

并行度

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

详细的并发与并行

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

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

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

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

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

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

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

medium 不是来源,它是其他人谈论他/她对某个主题的(错误)理解的文章,并不使他/她成为权威。 这是一个引文,因此是来源。这里的大多数答案都不是任何领域的权威人士写的,作者给出的解释已经足够好了。 在***,你至少有一个投票系统,它是一个专业人士社区。任何人都可以在介质上写任何东西。两者之间的比较并不公平。 任何人都可以在这里写任何东西,我不知道你为什么选择 Medium。无论如何,我是一名专业程序员,我赞同这种理解。我觉得它很优雅,因为它相对较短。 我认为这是不言自明的。【参考方案9】:

我将用简短而有趣的方式让您了解这些概念。

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

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

并行是一种特殊的并发,其中任务实际上是同时执行的。在计算机科学中,并行性可以 只能在多核环境中实现。

同步与异步 - 编程模型。

同步时,您将代码编写为按顺序执行的步骤,从顶部开始 到底部。在异步编程模型中,您将代码编写为任务, 然后同时执行。同时执行意味着 所有的任务很可能同时执行。

【讨论】:

【参考方案10】:

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

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

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

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

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

【讨论】:

【参考方案11】:

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

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

异步:每个人都说异步与并行无关,但它为它铺平了道路(让事情并行与否的责任在于你——继续阅读)。

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

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

【讨论】:

【参考方案12】:

用类比来解释这些术语。

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

并发:在开始另一个之前,您不会等待完成一个。例如,您可以先开始菜肴,也可以同时开始菜肴。他们可以按任何顺序完成,即即使您先开始洗碗,也可能先洗完衣服。

并行性:你的房子里不止一个人在做这项工作;例如,您可以洗碗,而其他人可以洗衣服。

异步:你告诉别人洗衣服,你告诉别人洗碗。他们实际上可以是同一个人(即您告诉他们洗衣服并立即告诉他们洗碗)。完成后,他们会向您报告。

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

【讨论】:

【参考方案13】:

并发与并行: 并发在一个时间点只能完成一项任务。示例:单 CPU 处理器 并行性在某一点上,我们可以执行多项任务。例如:双核或多核处理器

【讨论】:

【参考方案14】:

我给出真实世界的场景来解释 3 个主题 假设您想从艾哈迈达巴德旅行到孟买,但您不知道怎么走,所以您决定借助地图应用程序(谷歌地图)。

非常正常但低效的方法是您可以在启动汽车之前查看完整路径,然后您开始驾驶并到达目的地。

    并行 - 你可以不断地开车和观察路径。 异步 - 你有你的朋友在车里,你给了他你的手机打开地图应用程序并告诉他看地图并指导你。 并发 - 你开车几公里,把车停在一边,看地图,获取方向,然后重新开始开车等等。

【讨论】:

【参考方案15】:

总结

并发多件事情似乎同时发生(具有在并发任务之间快速切换的能力;它们是并发的,因为每个任务都想要一个资源、CPU 等)

并行真正同时发生多件事情时(执行的线程数与执行的内核数密切相关)

异步简单地说是非阻塞,当我们必须等待的事情不会让我们忙于等待时(需要某种通知机制才能继续我们离开的那一点)

【讨论】:

以上是关于并发、并行和异步方法有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

并发 并行 同步 异步 多线程的区别

Promise 实现方法(请求)的异步(串行)执行

Java基础中的一些概念理解

论并行,并发,同步,异步之间的联系与区别

同步与异步并发和并行阻塞和非阻塞

并发和并行,异步与多线程区别