并发是让两个任务在不同的线程上并行运行。然而,异步方法在同一个线程上并行运行。这是如何实现的?还有,并行性呢?
这三个概念有什么不同?
并发是让两个任务在不同的线程上并行运行。然而,异步方法在同一个线程上并行运行。这是如何实现的?还有,并行性呢?
这三个概念有什么不同?
当前回答
并发+并行都意味着同时运行多个任务。我看到一些人认为这是有区别的,但这取决于你咨询的参考文献,没有真正的正确或错误的答案。
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.
其他回答
我用真实的场景来解释3个话题 假设你想去艾哈迈达巴德到孟买旅行,但你不知道怎么走,所以你决定使用地图应用程序(谷歌Maps)。
很正常但效率很低的一种方法是,你可以在开车前看完整的路径,然后你开始开车并到达目的地。
平行-你可以不断地驾驶和观察路径。 异步-你的朋友和你在车里,你给他你的手机打开地图应用程序,告诉他看地图和指导你。 同时行驶——你开了几公里,把车停在一边,看地图,找方向,然后继续开车。
用类比来解释这些术语。
你的房子需要洗碗和洗衣服。
并发性:你不需要等完成一个任务后再启动另一个。例如,你可以先洗碗,也可以同时洗碗。他们可以按照任何顺序完成,也就是说,即使你先洗碗,也可能会先洗衣服。
平行性:你的房子里有不止一个人在做这件事;例如,你可以洗碗,而另一个人可以洗衣服。
异步:你让别人去洗衣服,你让别人去洗碗。他们实际上可以是同一个人(也就是说,你告诉他们去洗衣服,同时也告诉他们去洗碗)。他们处理完每个人后会向你报告。
同步:你叫别人去洗碗。你等着他们。当他们完成后,你可以做其他的事情(你可以告诉他们接下来洗衣服,或者你自己洗,或者你可以完全做其他的事情;重点是你在完成第一个任务时被阻塞,你与他们是同步的)。
并发是指多个任务的执行是交错的,而不是每个任务依次执行。
并行性是指这些任务实际上是并行执行的。
异步是一个单独的概念(尽管在某些上下文中是相关的)。它指的是一个事件可能发生在与另一个事件不同的时间(不同步)。下面的图表说明了同步执行和异步执行之间的区别,其中参与者可以对应于不同的线程、进程甚至服务器。
并发+并行都意味着同时运行多个任务。我看到一些人认为这是有区别的,但这取决于你咨询的参考文献,没有真正的正确或错误的答案。
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.
并发性可能发生在以下几种场景中:
异步——这意味着你的程序执行非阻塞操作。例如,它可以通过HTTP发起对远程资源的请求,然后在等待接收响应的同时继续执行一些其他任务。这有点像你发了一封电子邮件,然后继续你的生活,没有等待回复。
并行性——这意味着您的程序利用多核机器的硬件,通过将工作分解为任务,在同一时间执行任务,每个任务都在单独的核心上执行。这有点像洗澡时唱歌:你实际上是在同时做两件事。
多线程——这是一种允许不同线程并发执行的软件实现。多线程程序似乎同时在做几件事,即使它运行在单核机器上。这有点像通过各种IM窗口与不同的人聊天;虽然你实际上是在来回切换,但最终结果是你同时进行了多个对话。