并发是让两个任务在不同的线程上并行运行。然而,异步方法在同一个线程上并行运行。这是如何实现的?还有,并行性呢?
这三个概念有什么不同?
并发是让两个任务在不同的线程上并行运行。然而,异步方法在同一个线程上并行运行。这是如何实现的?还有,并行性呢?
这三个概念有什么不同?
当前回答
每个人都很难将异步与并行或并发相关联,因为异步既不是并行的反义词,也不是并发的反义词。它是同步的反义词。它只是表示某些东西,在这个例子中是线程,是否会与其他东西同步,在这个例子中是另一个线程。
其他回答
这里有一些语义需要澄清:
并发或并行是资源争用的问题,而异步是关于控制流的问题。
不同的过程(或它们的组成操作)被称为异步的,当它们的处理顺序没有确定的实现时;换句话说,它们中的任何一个都有可能在任何给定的时间t被处理。根据定义,多个处理器(例如cpu或Persons)使多个处理器同时被处理成为可能;在单个处理器上,它们的处理是交错的(例如线程)。
当异步过程或操作共享资源时,它们被称为Concurrent;当没有资源共享(例如不同的处理器和存储)时,并行性是微不足道的保证;否则必须解决并发控制问题。
因此,异步过程或操作可以与其他过程或操作并行或并发地处理。
用类比来解释这些术语。
你的房子需要洗碗和洗衣服。
并发性:你不需要等完成一个任务后再启动另一个。例如,你可以先洗碗,也可以同时洗碗。他们可以按照任何顺序完成,也就是说,即使你先洗碗,也可能会先洗衣服。
平行性:你的房子里有不止一个人在做这件事;例如,你可以洗碗,而另一个人可以洗衣服。
异步:你让别人去洗衣服,你让别人去洗碗。他们实际上可以是同一个人(也就是说,你告诉他们去洗衣服,同时也告诉他们去洗碗)。他们处理完每个人后会向你报告。
同步:你叫别人去洗碗。你等着他们。当他们完成后,你可以做其他的事情(你可以告诉他们接下来洗衣服,或者你自己洗,或者你可以完全做其他的事情;重点是你在完成第一个任务时被阻塞,你与他们是同步的)。
并发性可能发生在以下几种场景中:
异步——这意味着你的程序执行非阻塞操作。例如,它可以通过HTTP发起对远程资源的请求,然后在等待接收响应的同时继续执行一些其他任务。这有点像你发了一封电子邮件,然后继续你的生活,没有等待回复。
并行性——这意味着您的程序利用多核机器的硬件,通过将工作分解为任务,在同一时间执行任务,每个任务都在单独的核心上执行。这有点像洗澡时唱歌:你实际上是在同时做两件事。
多线程——这是一种允许不同线程并发执行的软件实现。多线程程序似乎同时在做几件事,即使它运行在单核机器上。这有点像通过各种IM窗口与不同的人聊天;虽然你实际上是在来回切换,但最终结果是你同时进行了多个对话。
“同步和异步是编程模型。并发和并行是任务执行的方式……” 来源:https://medium.com/better - programming/sync vs -异步并发- vs - vs - 5754 cdb60f66平行
换句话说,同步和异步描述了在进行函数调用时程序如何执行(它是等待还是继续执行?),而并发和并行描述了函数(任务)将如何执行(并发=可能同时执行,并行=有效地同时执行)。
总结
并发(Concurrent):多件事情似乎同时发生(具有在并发任务之间快速切换的能力;它们是并发的,因为每个任务都想要一块资源,CPU等等。)
并行是指同时发生多件事情(执行线程的数量与执行内核的数量密切相关)
异步是简单的非阻塞,当我们必须等待的事情不会让我们忙于等待(需要某种通知机制从我们离开的地方继续)