异步与同步执行,它到底意味着什么?

时间:2009-04-14 15:39:43

标签: asynchronous execution synchronous

异步和同步执行有什么区别?

22 个答案:

答案 0 :(得分:1556)

当您同步执行某些操作时,等待它完成后再继续执行其他任务。当您异步执行某些操作时,可以在完成之前继续执行其他任务。

话虽如此,在计算机环境中,这转化为在另一个“线程”上执行进程或任务。线程是作为工作单元存在的一系列命令(代码块)。操作系统可以管理多个线程,并在切换到另一个线程之前为线程分配处理器时间的一部分(“切片”),以便轮流做一些工作。在它的核心(原谅双关语),处理器可以简单地执行一个命令,它没有一次做两件事的概念。操作系统通过为不同的线程分配时间片来模拟这一点。

现在,如果你在混合中引入多个核心/处理器,那么事情实际上可能同时发生。操作系统可以将时间分配给第一个处理器上的一个线程,然后将相同的时间块分配给另一个处理器上的另一个线程。所有这一切都是为了让操作系统能够管理您的任务完成,同时您可以继续执行代码并执行其他操作。

异步编程是一个复杂的主题,因为当你可以同时执行它们时,事物如何结合在一起的语义。有很多关于这个主题的文章和书籍;看看!

答案 1 :(得分:1024)

同步/异步无需多线程。

同步或同步在某种程度上意味着“连接”或“依赖”。换句话说,两个同步任务必须彼此了解,并且一个任务必须以某种方式执行,这取决于另一个任务,例如等待启动直到另一个任务完成。
异步意味着它们是完全独立的,无论是在启动还是执行中,都不能以任何方式考虑对方。

同步(一个线程):

1 thread ->   |<---A---->||<----B---------->||<------C----->|

同步(多线程):

thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->| 

异步(一个线程):

         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 

异步(多线程):

 thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|
  • 任务A,B,C的起点和终点由<>个字符代表。
  • 由垂直条|
  • 表示的CPU时间片

从技术上讲,同步/异步的概念确实与线程没有任何关系。虽然通常情况下,发现异步任务在同一个线程上运行是不常见的,但有可能(参见下面的示例)并且 common 可以找到在单独的线程......不,同步/异步的概念必须完全,以确定在另一个(第一个)任务完成之前是否可以启动第二个或后续任务,或者是否必须等待。就这些。什么线程(或线程),进程或CPU,或者实际上,执行任务的硬件是什么并不重要。实际上,为了说明这一点,我已经编辑了图形以显示这一点。

异步示例。在解决许多工程问题时,该软件旨在将整个问题分解为多个单独的任务,然后异步执行它们。反转矩阵或有限元分析问题就是很好的例子。在计算中,排序列表就是一个例子。例如,快速排序例程将列表拆分为两个列表,并通过递归调用自身对每个列表进行排序。在上面的两个例子中,两个任务可以(并且经常是)异步执行。它们不需要在单独的线程上。即使是具有一个CPU的机器,也只有一个执行线程可以编码,以便在第一个任务完成之前启动第二个任务的处理。唯一的标准是一个任务的结果不必作为其他任务的输入。只要任务的开始和结束时间重叠,(只有当两者的输出都不需要作为另一个的输入时),它们才会异步执行,无论使用多少线程。

同步示例。任何由多个任务组成的进程,其中任务必须按顺序执行,但必须在另一台机器上执行(获取和/或更新数据,从金融服务获取股票报价等)。如果它在一台单独的机器上,则它位于一个单独的线程上,无论是同步还是异步。

答案 2 :(得分:574)

简单来说:

同步

您正在排队等待获得电影票。在你面前的每个人得到一个之前你不能得到一个,这同样适用于排在你后面的人。

ASYNCHRONOUS

你和许多其他人在一家餐馆。你点了食物。其他人也可以订购他们的食物,他们没有必要等待你的食物烹饪,并在他们订购之前送达你。 在厨房餐厅工作人员不断烹饪,服务和接受订单。 一旦煮熟,人们就会得到食物。

答案 3 :(得分:285)

通过类比的简单解释

同步执行

我的老板是一个忙碌的人。他告诉我写代码。我告诉他:好的。我开始了,他正像一只秃鹰一样看着我,站在我身后,从我肩膀上。我喜欢“Dude,WTF:你为什么不去做我做完的事情呢?”

他就像:“不,我在这里等待直到你完成。”这是同步的。

异步执行

老板告诉我要这样做,而不是在那里等待我的工作,老板下班并完成其他任务。当我完成工作后,我只是向老板报告说:“我做完了!”这是异步执行。

(听从我的建议:永远不要和你身后的老板一起工作。)

答案 4 :(得分:86)

同步执行表示执行发生在一个系列中。 A->B->C->D。如果您正在调用这些例程,A将会运行,然后结束,然后B将启动,然后结束,然后C将启动,等等。

使用异步执行,你开始一个例程,让它在你开始下一个的同时在后台运行,然后在某个时候,说“等待这个完成”。它更像是:

开始 A->B->C->D-> 等待 A完成

优点是,当B仍在运行时(在后台,在单独的线程上),您可以执行CD和/ A,因此你可以更好地利用你的资源,减少“挂起”或“等待”。

答案 5 :(得分:53)

同步意味着调用者等待响应或完成,异步调用者继续并且响应稍后(如果适用)。

举个例子:

    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

因为进行异步调用的方法会立即继续下一行代码。我说“可能”,因为使用异步操作无法保证执行顺序。它也可以作为原始执行,具体取决于线程时间等。

答案 6 :(得分:50)

简而言之,同步是指两个或多个流程的开始结束点, 执行即可。在此示例中,进程A的端点与进程B的起始点同步:

SYNCHRONOUS
   |--------A--------|
                     |--------B--------|

另一方面,

异步进程 not 使其起点和终点同步:

ASYNCHRONOUS
   |--------A--------|
         |--------B--------|

如果进程A与进程B重叠,它们会同时运行或synchronously(字典定义),因此会产生混淆。

更新:Charles Bretana改进了his answer,所以这个答案现在只是一个简单的(可能过于简化的)助记符。

答案 7 :(得分:33)

我认为这是有点圆的解释,但它仍然澄清了使用现实生活中的例子。

小例子:

假设播放音频涉及三个步骤:

  1. 从harddisk获取压缩歌曲
  2. 解压缩音频。
  3. 播放未压缩的音频。
  4. 如果您的音频播放器按顺序为每首歌曲执行步骤1,2,3,则它是同步的。你将不得不等待一段时间才能听到这首歌,直到歌曲真正被取出并解压缩。

    如果您的音频播放器执行步骤1,2,3彼此独立,那么它是异步的。即。 在播放音频1(步骤3)时,如果它并行地从硬盘中取出音频3(步骤1)并且它并行地解压缩音频2。 (第2步 ) 你最终会听到这首歌,而不必等待获取和解压缩。

答案 8 :(得分:22)

简单地说异步执行就是在后台做事。

例如,如果您想从互联网上下载文件,您可以使用同步功能来执行此操作,但它会阻止您的线程,直到文件完成下载。这可能会使您的应用程序无法响应任何用户输入。

相反,您可以使用异步方法在后台下载该文件。在这种情况下,下载功能立即返回,程序执行正常继续。所有下载操作都在后台完成,程序完成后会通知您。

答案 9 :(得分:19)

同步编程模型 - 将线程分配给一个任务并开始处理它。任务完成后,它可用于下一个任务。在这个模型中,它不能让执行任务处于中间以承担另一个任务。让我们讨论一下这个模型在单线程和多线程环境中的工作原理。

单线程 - 如果我们要完成几项任务并且当前系统只提供一个线程,那么任务将逐个分配给线程。它可以用图形描绘为
Synchronous Single Threaded

多线程 - 在这种环境中,我们曾经有多个线程可以接管这些任务并开始研究它。这意味着我们有一个线程池(也可以根据需求和可用资源创建新线程)和一堆任务。所以这些线程可以作为这些工作 Synchronous Multi-Threaded

异步编程模型 - 与同步编程模型相反,这里一个线程开始执行一个任务,它可以在中间保存它,保存当前状态并开始执行另一个任务。

单线程 Asynchronous Single Threade

多线程 Asynchronous Multi-Threaded

了解更多here

答案 10 :(得分:14)

当执行如下序列时:a&gt; b&gt; c&gt; d&gt;,如果我们在执行过程中遇到失败,例如:

a
b
c
fail

然后我们从头开始重新开始:

a
b
c
d

这是同步的

但是,如果我们执行相同的序列:a&gt; b&gt; c&gt; d&gt;,我们在中间失败:

a
b
c
fail

...但是我们不是从头重新开始,而是从故障点重新开始:

c
d

......这被称为异步。

答案 11 :(得分:11)

作为一个非常简单的例子,

<强>同步

想象一下,10名学生被指示在路上排队。

第三名学生解开了她的鞋带。现在她已经停止并再次捆绑。

她身后的所有学生都已经停下来,现在正等着她把它绑起来。 第一和第二名学生已经走过了所有人,并继续按照他们的惯常步伐。

10-->9-->8-->7-->6-->5-->4-->3.     2-->1-->

<强> ASYNCHRONOUS

想象一下10个随机的人走在同一条路上。 他们当然没有排队,只是随意地在路上的不同地方以不同的步伐行走。

第三人的鞋带解开了。她停下来再把它绑起来。

但是没有人在等她把它绑起来。其他人的行走方式与他们之前一样,与他们的步伐相同。

10-->    9-->
   8--> 7-->   6-->
 5-->  4-->  3. 2-->
1-->

答案 12 :(得分:7)

您将Synchronous与Parallel vs Series混淆。同步意味着所有的同时。同步化意味着与每个领域相关,这可以意味着串联或以固定间隔。虽然程序正在全力以赴,但它是串行运行的。得到一本字典......这就是为什么我们有不甜的茶。你有茶或加糖的茶。

答案 13 :(得分:6)

同步基本上意味着你一次只能执行一件事。异步意味着您可以一次执行多个任务,而不必完成当前事务的执行,以便继续执行下一个事务。

答案 14 :(得分:4)

同步操作在返回调用者之前完成其工作。

异步操作在返回调用者后执行(大部分或全部)其工作。

答案 15 :(得分:4)

我创建了一个gif来解释这一点,希望对您有所帮助: 看,第3行是异步的,其他的是同步的。 第3行之前的所有行都应等到该行完成工作之前,但是由于第3行是异步的,因此下一行(第4行)不要等待第3行,而第5行则应等待第4行完成其工作,第6行应等待第5行和第7行等待6行,因为第4、5、6、7行不是异步的。 line 3 is asynchronous and others are synchronous

答案 16 :(得分:2)

使用早餐示例说明

  1. 倒一杯咖啡。
  2. 加热锅,然后煎两个鸡蛋。
  3. 炒三片培根。
  4. 烤两片面包。
  5. 在烤面包上加黄油和果酱。
  6. 倒一杯橙汁。

如果您有烹饪经验,则可以异步执行这些指令。您将开始加热锅中的鸡蛋,然后开始培根。您将面包放进烤面包机,然后开始放鸡蛋。在该过程的每个步骤中,您都将开始一个任务,然后将注意力转移到可以引起注意的任务上。

做早餐异步非并行工作的一个很好的例子。一个人(或线程)可以处理所有这些任务。继续早餐的比喻,一个人可以通过在第一个任务完成之前启动下一个任务来异步制作早餐。无论有人在看菜,烹饪都会进行。一旦开始加热锅中的鸡蛋,就可以开始煎培根了。培根开始后,就可以将面包放进烤面包机了。

对于并行算法,您需要多个库克(或线程)。一个人做鸡蛋,一个人做培根,依此类推。每个人只会专注于一项任务。每个厨师(或线程)都将被同步阻止,以等待培根准备翻转或吐司吐司。

来自Asynchronous programming concepts的引用

答案 17 :(得分:1)

关于同步执行的“同时”定义(有时令人困惑),这是理解它的好方法:

同步执行代码块中的所有任务都是同时执行的。

异步执行代码块中的所有任务都不会同时执行。

答案 18 :(得分:1)

我认为一个很好的方式来考虑它是一个经典的运行接力赛

同步:像同一个团队的成员一样的流程,在他们收到接力棒(执行上一个流程/跑步者的结束)之前他们不会执行,但他们都在同步其他

异步:在同一个接力赛道上的不同球队成员之间的进程,他们会跑,停,互相异步,但在相同的比赛中(整体计划执行)。

有意义吗?

答案 19 :(得分:1)

Synchronize的另一个英文定义是Here

  

坐标;结合起来。

我认为这是一个比“同时发生”更好的定义。那个也是一个定义,但我认为它不适合它在计算机科学中使用的方式。

因此,异步任务不与其他任务协同工作,而同步任务与其他任务协同工作,因此一个任务在另一个任务启动之前完成。

如何实现这是一个不同的问题。

答案 20 :(得分:0)

同步意味着将逐行执行队列方式执行任务。假设只有车辆需要在朋友之间分享才能一个接一个地到达目的地车辆 在异步情况下,每个朋友都可以租用车辆并到达目的地。

答案 21 :(得分:0)

是的,同步意味着在同一时间,从字面上看,这意味着一起工作。世界上有多个人/对象可以同时执行多项操作,但是如果我们看计算机,它表示同步意味着进程协同工作,这意味着进程依赖于彼此的返回,这就是为什么它们被执行的原因接proper而来。异步意味着进程不能一起工作,但它们可以同时工作(如果在多线程上),但可以独立工作。