异步执行和同步执行之间的区别是什么?
当前回答
以下是制作早餐的说明:
倒一杯咖啡。 烧热平底锅,然后煎两个鸡蛋。 煎三片培根。 烤两片面包。 在吐司上加黄油和果酱。 倒一杯橙汁。 如果你有烹饪经验,你会异步执行这些指令。你会先热锅煎鸡蛋,然后开始煎培根。你把面包放进烤面包机,然后开始煎鸡蛋。在这个过程的每一步,你都要开始一项任务,然后把注意力转移到那些已经准备好的任务上。 做早餐就是一个非并行的异步工作的好例子。一个人(或线程)可以处理所有这些任务。继续早餐的类比,一个人可以异步地做早餐,在第一个任务完成之前开始下一个任务。不管有没有人在看,烹饪都在进行。一旦你开始加热煎蛋的锅,你就可以开始煎培根了。培根烤好后,你可以把面包放进烤面包机。 对于并行算法,您需要多个cook(或线程)。一个做鸡蛋,一个做培根,等等。每个人都只专注于一项任务。每次烹饪(或线程)都将同步阻塞,等待培根准备翻转,或吐司爆裂。
(强调我的)
异步编程概念
其他回答
同步是指调用方等待响应或完成,异步是指调用方继续执行并且稍后出现响应(如果适用的话)。
举个例子:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
这将总是输出:
Before call
In call
After call
但如果我们要使doSomething()异步(有多种方式来做它),那么输出可以变成:
Before call
After call
In call
因为进行异步调用的方法将立即继续执行下一行代码。我之所以说“可能”,是因为异步操作无法保证执行顺序。它也可以作为原始文件执行,这取决于线程计时等。
简单地说,异步执行是在后台做一些事情。
例如,如果你想从互联网上下载一个文件,你可以使用同步函数来做这件事,但它会阻塞你的线程,直到文件下载完成。这可能使您的应用程序对任何用户输入都没有响应。
相反,您可以使用异步方法在后台下载文件。在这种情况下,下载函数立即返回,程序继续正常执行。所有的下载操作都是在后台完成的,当你的程序完成时会收到通知。
我认为这是一个有点迂回的解释,但它仍然澄清了使用现实生活中的例子。
小例子:
让我们假设播放音频包含三个步骤:
从硬盘中获取压缩的歌曲 解压音频。 播放未压缩的音频。
如果你的音频播放器为每首歌依次执行步骤1、2、3,那么它就是同步的。你必须等待一段时间才能听到这首歌,直到这首歌真正被提取和解压。
如果你的音频播放器独立执行第1、2、3步,那么它就是异步的。ie。 当播放音频1(步骤3)时,如果它并行地从硬盘中获取音频3(步骤1),并且并行地解压音频2。(第二步) 你最终会听到这首歌,而不需要等待太多的取回和解压。
你混淆了同步与并联与串联。同步的意思是同时发生所有的事情。同步的意思是彼此相关,可以是串联的,也可以是固定间隔的。当程序在做所有的事情时,它是串联运行的。找本字典……这就是为什么我们有不甜的茶。你有茶或甜茶。
当执行a>b>c>d>这样的序列时,如果我们在执行过程中遇到如下失败:
a
b
c
fail
然后我们从头开始:
a
b
c
d
这是同步的
然而,如果我们有相同的序列要执行:a>b>c>d>,我们在中间有一个失败:
a
b
c
fail
...但我们不是从头开始,而是从失败的地方重新开始:
c
d
...这就是所谓的异步。