异步执行和同步执行之间的区别是什么?
当前回答
同步的不同英文定义在这里
协调;结合。
我认为这比“同时发生”的定义更好。这也是一个定义,但我不认为它适合计算机科学中使用的方式。
因此异步任务不与其他任务协同,而同步任务与其他任务协同,因此一个任务在另一个任务开始之前完成。
如何实现这一点是另一个问题。
其他回答
简而言之,同步指的是两个或多个进程的起点和终点,而不是它们的执行。在本例中,进程A的端点与进程B的起点同步:
SYNCHRONOUS |--------A--------| |--------B--------|
另一方面,异步进程的起点和终点不同步:
ASYNCHRONOUS |--------A--------| |--------B--------|
在进程A与进程B重叠的地方,它们是并发或同步运行的(字典定义),因此造成了混淆。
更新:Charles Bretana改进了他的答案,所以这个答案现在只是一个简单的(可能过于简化了)助记符。
当执行a>b>c>d>这样的序列时,如果我们在执行过程中遇到如下失败:
a
b
c
fail
然后我们从头开始:
a
b
c
d
这是同步的
然而,如果我们有相同的序列要执行:a>b>c>d>,我们在中间有一个失败:
a
b
c
fail
...但我们不是从头开始,而是从失败的地方重新开始:
c
d
...这就是所谓的异步。
以下是制作早餐的说明:
倒一杯咖啡。 烧热平底锅,然后煎两个鸡蛋。 煎三片培根。 烤两片面包。 在吐司上加黄油和果酱。 倒一杯橙汁。 如果你有烹饪经验,你会异步执行这些指令。你会先热锅煎鸡蛋,然后开始煎培根。你把面包放进烤面包机,然后开始煎鸡蛋。在这个过程的每一步,你都要开始一项任务,然后把注意力转移到那些已经准备好的任务上。 做早餐就是一个非并行的异步工作的好例子。一个人(或线程)可以处理所有这些任务。继续早餐的类比,一个人可以异步地做早餐,在第一个任务完成之前开始下一个任务。不管有没有人在看,烹饪都在进行。一旦你开始加热煎蛋的锅,你就可以开始煎培根了。培根烤好后,你可以把面包放进烤面包机。 对于并行算法,您需要多个cook(或线程)。一个做鸡蛋,一个做培根,等等。每个人都只专注于一项任务。每次烹饪(或线程)都将同步阻塞,等待培根准备翻转,或吐司爆裂。
(强调我的)
异步编程概念
举个简单的例子,
同步
想象一下,三个学生被要求在公路上进行接力赛。
第一个学生跑完指定的距离,停下来把接力棒传给第二个。没有人开始跑步。
1------>
2.
3.
当第二个学生拿起接力棒时,她开始跑指定的距离。
1.
2------>
3.
第二个学生解开了鞋带。现在她又停了下来,重新系上了领带。因此,2号的结束时间延长了,3号的开始时间推迟了。
1.
--2.--->
3.
这种模式一直持续到第三名从第二名手中接过接力棒并完成比赛。
异步
想象一下,10个人随机走在同一条路上。 他们当然不是在排队,只是随机地在路上不同的地方以不同的速度行走。
第二个人的鞋带被解开了。她停下来又把它扎了起来。
但没人等着她把头发扎起来。其他人都还在以同样的速度走着他们以前的路。
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
关于同步执行的“同时”定义(有时会令人困惑),下面是一种理解它的好方法:
同步执行:一个代码块中的所有任务都在同一时间执行。
异步执行:一个代码块中的所有任务都不会同时执行。