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

时间:2011-01-30 18:22:48

标签: multithreading asynchronous concurrency

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

这三个概念有什么不同?

13 个答案:

答案 0 :(得分:102)

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

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

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

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


修改

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

答案 1 :(得分:36)

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

并行是指这些任务实际并行执行的时间。

enter image description here

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

enter image description here

enter image description here

答案 2 :(得分:13)

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

答案 3 :(得分:7)

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

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

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

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

答案 4 :(得分:3)

围绕这些概念,我要简短有趣。

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

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

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

同步与异步-编程模型。

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

答案 5 :(得分:2)

  

并发

     

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

     

并行

     

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

     

并发与并行细节

     

正如您所看到的,并发性与应用程序如何处理其工作的多个任务有关。应用程序可以同时处理一个任务(按顺序)或同时处理多个任务(同时)。

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

     

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

     

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

     

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

     

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

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

答案 6 :(得分:0)

同意VS并行: 在一个时间点并发只能完成一项任务。示例:单个cpu处理器 并行性在某一点上我们可以完成多项任务。示例:双核或多核处理器

答案 7 :(得分:0)

Parallel : It's a broad term that means that two pieces of code execute that "at the same time" to the point where the parallel execution becomes "real". Sounds vague and simplistic? Yes. I'm trying to help you focus on the differences between those concepts rather than providing each individual technical definition.

So I wrote "real" because parallelism can be simulated to a certain degree. Many systems, for example games, implement "parallel" subsystems that perform lots of task during each execution loop (for example: some of them make extensive use of agents), but most of the time they're only parallel in the sense that they each do their little thing in no predictible order, access data seemingly randomly, and even if you implemented some sort of primitive software-based cooperative multitasking to organize the whole thing, it's still not really parallel. It's just a very complicated sequential system.

You might say that parallelism becomes real when there's a third-party system (whether be an underlying preemptive OS offering threads, or CPU cores) specifically designed to run code in black boxes that you can't control (except for the time at which they start and the result they produce, plus any mutex or semaphores you might throw in)

Concurrent : there can't be concurrency without parallelism (whether simulated or real, as I explained above), but this term focuses specifically on the fact that the two systems will try to access the same resource at the same time at some point. It puts the emphasis on the fact that you're going to have to deal with that.

Asynchronous : everyone is right by saying that asynchronous is unrelated with parallelism, but it paves the way to it (the burden is on you to make things parallel or not -- keep reading).

You might see this concept as a way to represent parallelism by formalizing the three basic things usually involved in parallelism : 1) define the task's initialization (say when it starts and what parameters it gets), 2) what must be done after it finishes and 3) What the code should continue doing inbetween.

But it's still only syntax (usually it's represented as callback methods). Behind the scene, the underlying system might simply decide that these so-called "tasks" are just fragments of code to pile up until it finishes the code it's currently executing. And then it unpiles them one by one and executes them sequentially. Or not. It might also create a thread per task and run them in parallel. Who cares? That part is not included in the concept ;)

答案 8 :(得分:0)

在这里我举例说明

并发性

网络服务实时接收许多小请求,它需要以不同的方式以及独立于其他请求的方式处理每个请求。

  • 许多任务已执行
  • 实时
  • 具有不同的执行顺序(每次调用可以有多个 task 或一个 task 可以不同地运行)

  • 大大减少了响应时间

平行主义

一个 GPU 使用并行处理在成千上万的物理和逻辑线程上处理同一代码块(又名“内核” )。每个内核调用有时都使用不同的内存块进行读/写操作。理想情况下,该过程同时开始和结束所有线程。没有超线程的单个CPU内核无法进行并行处理。

  • 一个内核在多个处理器上执行
  • 同时
  • 具有单个执行序列(有一个 kernel ,其中避免了分支或 if
  • 实质上提高了速度

异步

一个繁重的进程(如I / O操作)可以很容易地阻塞GUI (如果它在GUI线程上运行)。为了保证 UI响应性,可以异步执行繁重的过程。最好一次一次运行类似的异步操作。例如如果同时运行多个IO绑定操作,可能会明显变慢,因此最好排队完成它们以启动

  • 一个 task 一批任务在另一个线程上执行
  • 一次一次一次
  • 执行顺序无关紧要,因为没有并发
  • 实质上降低了速度,但提供了对另一个线程的响应性

注意: 并发执行的异步操作(即一次执行多次)是并发操作。

答案 9 :(得分:0)

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

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

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

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

答案 10 :(得分:0)

这里需要澄清一些语义:

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

当没有确定性地执行处理的顺序时,

不同的过程(或其组成的操作)被称为异步;换句话说,很可能在给定的时间T可以对它们中的任何一个进行处理。根据定义,多个处理器(例如CPU或Persons)可以同时处理多个处理器;在单个处理器上,它们的处理是交错的(例如线程)。

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

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

  1. 平行 - 您可以不断驾驶和观察路径。
  2. 异步 - 你有你的朋友在车里,你给了他你的手机,打开了地图应用程序,并告诉他看地图并指导你。
  3. 并发 - 你开车几公里,把车停在一边,看地图,查询路线,然后再次开始开车等等。