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

这三个概念有什么不同?


当前回答

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

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

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.

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

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

其他回答

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

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

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

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

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

Asynchronous: In some communities this means non-blocking code, which can mean two things: It almost always means it will not block an OS thread. However, non-blocking can optionally mean that the next line of source code in a function will continue to run without delay. In Python await asyncio.sleep(5) blocks execution of the function, but not the OS thread, and that is considered async. In Golang, you have "goroutines" that similarly to Python's await, they block execution of code, but not OS threads, however, this is not referred to as async in the Golang community. It's just concurrent programming.

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

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

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

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.

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

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

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

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

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

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

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