并发、并行和异步方法之间的区别是什么?

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

这三个概念有什么不同?

114545 次浏览

并发和并行实际上是相同的原理,两者都与同时执行的任务有关,尽管我想说并行任务应该是真正的多任务,“同时”执行,而并发可能意味着任务共享执行线程,同时仍然看起来是并行执行。

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

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

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


编辑

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

每个人都很难将异步与并行或并发相关联,因为异步既不是并行的反义词,也不是并发的反义词。它是同步的反义词。它只是表示某些东西,在这个例子中是线程,是否会与其他东西同步,在这个例子中是另一个线程。

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

并发性

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

并行性

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

并发与并行的详细介绍

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

另一方面,并行性与应用程序处理每个单独任务的方式有关。应用程序可以从开始到结束连续处理任务,或者将任务分成可以并行完成的子任务。

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

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

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

最后,应用程序也可以是并行的和并行的,因为它可以同时处理多个任务,还可以将每个任务分解为并行执行的子任务。然而,在这种情况下,并发性和并行性的一些好处可能会丧失,因为计算机中的cpu已经在并发性或并行性方面相当忙碌。将它们组合在一起可能只会导致很小的性能提高甚至性能损失。在盲目地采用并发并行模型之前,请确保您进行了分析和度量。

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

并发性是指多个任务的执行是交错的,而不是每个任务依次执行。

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

enter image description here


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

enter image description here

enter image description here

这是一个广义的术语,意思是两段代码“同时”执行。不管它是“真正的”并行,还是通过一些聪明的设计模式伪造出来的。关键是你可以同时启动这些“任务”,然后分别控制它们(使用互斥和所有适当的技巧)。 但通常你更喜欢用“并行”这个词来描述“真正的”并行,比如:你通过非合作的多任务来实现它(无论是通过CPU/GPU内核,还是通过让操作系统在非常低的级别上管理它)。人们不愿意说“并行”只是为了复杂的序列代码,假并行,就像你会发现在浏览器窗口的javascript的例子。因此,这篇文章中人们说“异步与并行无关”的原因。

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

异步:每个人都说异步与并行无关是对的,但它为并行铺平了道路(让事情并行或不并行的负担在你身上——继续阅读)。

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

但它仍然只是语法(通常表示为回调方法)。在后台,底层系统可能简单地认为这些所谓的“任务”只是堆积起来的代码片段,直到它完成当前正在执行的代码。然后它一个接一个地把它们拆开,然后依次执行。与否。它还可以为每个任务创建一个线程,并并行运行它们。谁在乎呢?这部分不包括在概念中;)

并发性可能发生在以下几种场景中:

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

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

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

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

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

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

异步过程或操作被称为Concurrent,当它们共享资源;当没有资源共享(例如不同的处理器和存储)时,并行性是微不足道的保证;否则必须解决并发控制问题。

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

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

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

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

并行性就像同时执行多个任务,就像你可以一边唱歌一边洗澡。现在你在并行地做这些任务。

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

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

我会让它简短而有趣,让你们能够理解这些概念。

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

举个现实生活中的例子:有个挑战要求你去做 两人都吃了一个大蛋糕,唱了一整首歌。如果你愿意,你就赢了 谁唱得最快,谁就吃完了蛋糕。因此, 规则是你边唱边吃同时。你怎么做呢 不属于规则。你可以吃掉整个蛋糕,然后唱 整首歌,或者你可以吃半个蛋糕,然后唱半首歌,然后做 等等

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

编程模型。

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

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

很正常但效率很低的一种方法是,你可以在开车前看完整的路径,然后你开始开车并到达目的地。

  1. 平行 -你可以不断地驱动和观察路径。
  2. 异步 -你和你的朋友在车里,你给他你的手机打开了地图应用程序,告诉他看地图并引导你。
  3. 并发 -你开了几公里,把车停在一边,看地图,得到方向,然后又开始开车等等。

用类比来解释这些术语。

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

并发性:你不需要等完成一个任务后再启动另一个。例如,你可以先洗碗,也可以同时洗碗。他们可以按照任何顺序完成,也就是说,即使你先洗碗,也可能会先洗衣服。

平行性:你的房子里有不止一个人在做这件事;例如,你可以洗碗,而另一个人可以洗衣服。

异步:你让别人去洗衣服,你让别人去洗碗。他们实际上可以是同一个人(也就是说,你告诉他们去洗衣服,同时也告诉他们去洗碗)。他们处理完每个人后会向你报告。

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

总结

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

多件事真的会同时发生(执行线程的数量与执行内核的数量紧密相关)时,平行

异步简单地写为非阻塞,当我们必须等待的事情不让我们忙着等待时(需要某种通知机制从我们停止的地方继续)

并行性发生在经理有几个工人,可以给他们每个人一个单独的任务。工人们做他们的工作,并向经理提供结果。如果任务不能完全分离,例如任务之间的结果有一定的依赖性,或者需要在没有其他推理的情况下使用相同的资源,那么并行度就受到这些约束,不能完全实现。

并发性发生在经理有几个任务但只有较少的工人时,因此一些工人被赋予多个任务。任何工作人员被赋予多个任务,将每个原始给定的任务划分为几个步骤,并将这些步骤交叉进行,每个步骤完成后,每个任务的结果将立即反馈给经理。经理收到一个任务结果,而其他任务已经启动并进展了几个步骤,但尚未完成。如果任何有多个任务的worker决定在完成已经开始的任务的每个步骤之前不开始给定任务的单个步骤,这被称为顺序性

异步从管理器的角度来看,是上述两个混合或分开的任意一个。当经理将任务分配给少数或足够多的工人时,他不应等待,直到收到任何结果。他可以在工作进展的同时做自己的工作。通常工作人员不决定如何将任务划分为步骤。“控制倒置”指的是管理者决定各个步骤,并将单个步骤交给员工。所以当他从一个worker那里收到一个步骤结果时,给他另一个步骤,也许是另一个任务。被控制的人还负责将后退步骤的结果组合成任务结果。异步性伴随着控制和协调的责任。如果任何工人被要求工作按顺序,从经理的角度来看,他是一个同步工人。

总结因为很容易猜测,完整的并行性是一个不可能实现的想法,除非在很少的情况下。因为现实带来了相互依赖的任务和共享的资源,以及工人的缺乏。所以并发性是现实。从管理者的角度来看,如果不妨碍他对任务的精细控制,则并发性是最好的,如果是正的,则称为异步。此外,计算机软件工程最佳实践,由固体原则中的年代扩展,历史上使服务器单步运行器称为微服务,这将控制权交还给客户端。因此,从服务器的角度来看,当前的情况是并发性,从客户端角度来看是异步性

并发 + 平行都表示同时运行多个任务。我看到一些人认为这是有区别的,但这取决于你咨询的参考文献,没有真正的正确或错误的答案。

异步:在一些社区中,这意味着非阻塞代码,这可能意味着两件事:它几乎总是意味着它不会阻塞一个OS线程。然而,非阻塞可能意味着函数中的下一行源代码将继续运行而不会延迟。在Python中,await asyncio.sleep(5)阻塞函数的执行,但不阻塞操作系统线程,这被认为是异步的。在戈朗,你有“goroutines"类似于Python的await,它们阻塞代码的执行,而不是OS线程,然而,这在Golang社区中不被称为异步。它只是并行编程。