异步执行和同步执行之间的区别是什么?
当前回答
举个简单的例子,
同步
想象一下,三个学生被要求在公路上进行接力赛。
第一个学生跑完指定的距离,停下来把接力棒传给第二个。没有人开始跑步。
1------>
2.
3.
当第二个学生拿起接力棒时,她开始跑指定的距离。
1.
2------>
3.
第二个学生解开了鞋带。现在她又停了下来,重新系上了领带。因此,2号的结束时间延长了,3号的开始时间推迟了。
1.
--2.--->
3.
这种模式一直持续到第三名从第二名手中接过接力棒并完成比赛。
异步
想象一下,10个人随机走在同一条路上。 他们当然不是在排队,只是随机地在路上不同的地方以不同的速度行走。
第二个人的鞋带被解开了。她停下来又把它扎了起来。
但没人等着她把头发扎起来。其他人都还在以同样的速度走着他们以前的路。
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
其他回答
简单地说,异步执行是在后台做一些事情。
例如,如果你想从互联网上下载一个文件,你可以使用同步函数来做这件事,但它会阻塞你的线程,直到文件下载完成。这可能使您的应用程序对任何用户输入都没有响应。
相反,您可以使用异步方法在后台下载文件。在这种情况下,下载函数立即返回,程序继续正常执行。所有的下载操作都是在后台完成的,当你的程序完成时会收到通知。
当您同步执行某项任务时,您需要等待该任务完成后才能继续执行另一项任务。当您异步执行某个任务时,您可以在它完成之前转移到另一个任务。
在操作系统上下文中,这对应于在“线程”上执行进程或任务。线程是作为工作单元存在的一系列命令(代码块)。操作系统在处理器核心上运行给定的线程。然而,处理器内核一次只能执行一个线程。它没有同时运行多个线程的概念。操作系统可以通过运行每个线程一小段时间(比如1ms),并在线程之间不断切换,来提供同时运行多个线程的假象。
现在,如果您在混合中引入多个处理器核心,那么线程可以同时执行。操作系统可以将时间分配给第一个处理器核心上的一个线程,然后将相同的时间块分配给不同处理器核心上的另一个线程。所有这些都是关于允许操作系统管理任务的完成,而您可以继续在代码中执行其他事情。
异步编程是一个复杂的主题,因为当您可以同时进行这些事情时,它们是如何结合在一起的语义。关于这个主题的文章和书籍数不胜数;看看吧!
同步执行意味着在单个系列中执行。A - C > B - > - > D。如果您正在调用这些例程,则A将运行,然后结束,然后B将开始,然后结束,然后C将开始,等等。
使用异步执行,你开始一个例程,并让它在后台运行,同时你开始下一个例程,然后在某个时候,说“等待这个完成”。更像是:
开始A->B->C->D->等待A完成
这样做的好处是,当A仍在运行时(在后台,在一个单独的线程上),您可以执行B、C和或D,因此您可以更好地利用资源,减少“挂起”或“等待”。
关于同步执行的“同时”定义(有时会令人困惑),下面是一种理解它的好方法:
同步执行:一个代码块中的所有任务都在同一时间执行。
异步执行:一个代码块中的所有任务都不会同时执行。
同步的不同英文定义在这里
协调;结合。
我认为这比“同时发生”的定义更好。这也是一个定义,但我不认为它适合计算机科学中使用的方式。
因此异步任务不与其他任务协同,而同步任务与其他任务协同,因此一个任务在另一个任务开始之前完成。
如何实现这一点是另一个问题。