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

这三个概念有什么不同?


当前回答

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

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

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

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

其他回答

Parallel : It's a broad term that means that two pieces of code execute that "at the same time". It doesn't matter if it's "real" parallelism or if it's faked through some clever design pattern. The point is that you can start the "tasks" at the same time and then control them separately (with mutex and all the appropriate tricks). But usually you prefer to use the word "parallel" only for "true" parallelism, as in : you make it happen through non-cooperative multitasking (whether be throuch CPU/GPU cores, or only at software level by letting the OS managing it at a very low level). People are reluctant to say "parallel" just for complicated sequential code that fakes parallelism, like you would find in a browser window's javascript for example. Hence the reason why people in this thread say "asynchronous has nothing to do with parallelism". Well it does, but just don't confuse them.

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

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

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

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

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

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

Take an example in real life: There’s a challenge that requires you to both eat a whole huge cake and sing a whole song. You’ll win if you’re the fastest who sings the whole song and finishes the cake. So the rule is that you sing and eat concurrently. How you do that does not belong to the rule. You can eat the whole cake, then sing the whole song, or you can eat half a cake, then sing half a song, then do that again, etc. Parallelism is a specific kind of concurrency where tasks are really executed simultaneously. In computer science, parallelism can only be achieved in multicore environments.

同步与异步——编程模型。

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

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

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

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

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


EDIT

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

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

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

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

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

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

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

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

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

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