Home Articles

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

Asked
Viewed 910 times
101

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

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

9 Answers

  • 87

    在这里我用一些例子来解释

    并发

    web service 实时接收许多小请求,它需要以不同方式处理这些请求,并且独立于其他请求 .

    • 执行了许多任务

    • 实时

    • 具有不同的执行顺序(每个调用可以有多个任务或一个任务可以不同的方式运行)

    • 本质上缩短了响应时间

    平行

    GPU 使用并行处理在数千个物理和逻辑线程上处理相同的代码块(AKA内核) . 每个内核调用有时会使用不同的内存块进行读/写操作 . 理想情况下,进程同时开始和结束所有线程 . 没有超线程的单CPU内核无法进行并行处理 .

    • 在多个处理器上执行一个内核

    • 同时

    • 具有单个执行序列(有一个内核,其中分支或如果避免)

    • 本质上提高了速度

    异步

    如果它在GUI线程上运行, One heavy process (就像I / O操作一样)可以轻松阻止GUI . 为了保证UI响应能力,可以异步执行繁重的进程 . 最好一次运行一个类似的异步操作 . 例如如果同时运行,多个IO绑定操作可能会明显变慢,因此最好将它们排队以完成启动

    • 在另一个线程上执行一个任务或一批任务

    • 一次或一次一次

    • 执行顺序无关紧要/适用,因为没有并发性

    • 本质上降低了速度,但提供了对另一个线程的响应

    Note: 同时执行的异步操作(即,一次多于一次)是并发操作 .

  • 56

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

    Parallelism 是某些任务实际并行执行的时间 .

    enter image description here


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

    enter image description here

    enter image description here

  • 21

    并发并发意味着应用程序同时在多个任务上同时进行(同时) . 好吧,如果计算机只有一个CPU,则应用程序可能无法在同一时间在多个任务上取得进展,但是在应用程序内部一次处理多个任务 . 在下一个任务开始之前,它并没有完全完成任务 . 并行性并行性意味着应用程序将其任务分成较小的子任务,这些子任务可以并行处理,例如在同一时间在多个CPU上 . 并发性与并行性详细信息正如您所看到的,并发性与应用程序如何处理其工作的多个任务有关 . 应用程序可以在某个时间(顺序)处理一个任务,或者同时处理多个任务(同时) . 另一方面,并行性与应用程序处理每个单独任务的方式有关 . 应用程序可以从开始到结束连续地处理任务,或者将任务分成可以并行完成的子任务 . 如您所见,应用程序可以是并发的,但不是并行的 . 这意味着它同时处理多个任务,但任务不会分解为子任务 . 应用程序也可以是并行的但不是并发的 . 这意味着应用程序一次只能处理一个任务,并且此任务被分解为可以并行处理的子任务 . 此外,应用程序既不能并发也不能并行 . 这意味着它一次只能处理一个任务,并且任务永远不会分解为并行执行的子任务 . 最后,应用程序也可以是并发和并行的,因为它既可以同时处理多个任务,也可以将每个任务分解为子任务以便并行执行 . 但是,在这种情况下,并发和并行性的一些好处可能会丢失,因为计算机中的CPU已经相当忙于单独的并发或并行 . 将它组合在一起可能只会带来很小的性能提升甚至性能损失 . 在盲目采用并发并行模型之前,请确保进行分析和测量 .

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

  • 12

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

  • 2

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

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

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

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


    编辑

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

  • 0

    简而言之,

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

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

    Differences between concurrency vs. parallelism

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

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

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

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

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

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

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

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

    Concurrency

    当我们讨论最少两个或更多任务时,并发性基本上是适用的 . 当应用程序能够同时虚拟地执行两个任务时,我们将其称为并发应用程序 . 虽然这里的任务运行看起来像是同时的,但基本上它们可能不会 . 它们利用操作系统的CPU时间切片功能,其中每个任务运行其任务的一部分,然后进入等待状态 . 当第一个任务处于等待状态时,CPU被分配给第二个任务以完成它的任务 . 因此,基于任务优先级的操作系统分配CPU和其他计算资源,例如,记忆;轮流转向所有任务并给予他们完成的机会 . 对于最终用户,似乎所有任务都是并行运行的 . 这称为并发 .

    Parallelism

    并行性不需要存在两个任务 . 它实际上是通过为每个任务或子任务分配一个核心来物理运行部分任务或多个任务,同时使用CPU的多核基础结构 . 并行性要求硬件具有多个处理单元 . 在单核CPU中,您可能会得到并发但不是并行性 .

    Asynchronous methods

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

  • 0

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

  • 0

    Parallel : It 's a broad term that means that two pieces of code execute that 1838290 to the point where the parallel execution becomes 1838291 . Sounds vague and simplistic? Yes. I' m试图帮助您专注于这些概念之间的差异,而不是提供每个单独的技术定义 .

    所以我写了"real"因为可以在一定程度上模拟并行性 . 许多系统,例如游戏,实现了在每个执行循环期间执行大量任务的子系统(例如:其中一些广泛使用代理),但大多数时候它们只是在它们各自执行的意义上是并行的他们的小东西没有可预测的顺序,看似随机访问数据,即使你实现了某种原始的基于软件的合作多任务来组织整个事情,它仍然没有真正平行 . 这只是一个非常复杂的顺序系统 .

    您可能会说当并存在第三方系统(无论是基础抢占式操作系统提供线程还是CPU核心)时,并行性变为现实,这些系统专门用于在无法控制的黑盒子中运行代码(除了它们的时间除外)开始,它们产生的结果,以及你可能抛出的任何互斥锁或信号量)

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

    Asynchronous :每个人都说对,异步与并行性无关,但它为它铺平了道路(负担是让你把事情做成平行与否 - 继续阅读) .

    您可能会将此概念视为通过形式化并行性中通常涉及的三个基本事物来表示并行性的一种方式:1)定义任务的初始化(例如,它何时开始以及它获得什么参数),2)在完成后必须完成的事情和3)代码应该继续做什么 .

    但它仍然只是语法(通常它表示为回调方法) . 在场景的后面,底层系统可能只是简单地决定这些所谓的“任务”只是代码的片段,直到完成它当前正在执行的代码为止 . 然后它逐个解压缩它们并按顺序执行它们 . 或不 . 它还可以为每个任务创建一个线程并并行运行它们 . 谁在乎?该部分未包含在概念中;)

  • 0

    有几种情况可以发生并发:

    Asynchrony - 这表示您的程序执行非阻塞操作 . 例如,它可以通过HTTP发起对远程资源的请求,然后在等待接收响应时继续执行其他任务 . 这有点像你发送电子邮件然后继续你的生活而不等待回应 .

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

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

Related