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

问题描述 投票:1034回答:22

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

asynchronous execution synchronous
22个回答
1590
投票

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

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

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

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


21
投票

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

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

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

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

单螺纹Asynchronous Single Threade

多线程Asynchronous Multi-Threaded

阅读更多here


14
投票

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

a
b
c
fail

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

a
b
c
d

这是同步的

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

a
b
c
fail

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

c
d

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


11
投票

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

同步

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

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

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

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

异步

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

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

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

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

7
投票

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


6
投票

同步基本上意味着你一次只能执行一件事。异步意味着您可以一次执行多个操作,并且您不必完成当前操作即可继续执行下一个操作。


5
投票

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


4
投票

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

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


2
投票

使用说明制作早餐的示例

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

如果您有烹饪经验,则可以异步执行这些说明。你要开始加热鸡蛋,然后开始培根。你把面包放在烤面包机里,然后开始做蛋。在流程的每个步骤中,您都可以启动任务,然后将注意力转移到可以引起注意的任务上。

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

对于并行算法,您需要多个cooks(或线程)。一个人会做鸡蛋,一个是培根,等等。每个人都只关注那一项任务。每个厨师(或线程)将被同步阻塞,等待培根准备好翻转,或者吐司。

参考Asynchronous programming concepts


1
投票

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

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

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


1
投票

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

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

异步:如同同一个接力赛中不同球队成员的进程跟踪,他们将运行和停止,彼此异步,但在同一种族(整体程序执行)内。

是否有意义?


1049
投票

同步/异步无需多线程。

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

同步(一个线程):

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时间片

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

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

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


1
投票

Synchronize的另一个英文定义是Here

坐标;结合。

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

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

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


0
投票

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


0
投票

是同步意味着同时,从字面上看,它意味着一起完成工作。世界上多个人/物体可以同时做多件事但是如果我们看一下计算机,就说同步意味着过程一起工作,这意味着过程依赖于彼此的回归,这就是他们被执行的原因之一按顺序排列。异步意味着进程不能一起工作,它们可以同时工作(如果是多线程的),但是独立工作。


585
投票

简单来说:

同步

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

异步

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


291
投票

Simple Explanation via analogy

同步执行

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

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

异步执行

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

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


87
投票

同步执行意味着执行在一个系列中发生。 A->B->C->D。如果你正在调用这些例程,A将运行,然后完成,然后B将启动,然后完成,然后C将启动,等等。

使用异步执行,您可以开始一个例程,让它在后台启动时在后台运行,然后在某个时刻,说“等待完成”。它更像是:

启动A->B->C->D->Wait为A完成

优点是你可以执行BCD,而A仍在运行(在后台,在一个单独的线程上),这样你就可以更好地利用你的资源,减少“挂起”或“等待”。


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

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


52
投票

简而言之,同步是指两个或多个进程的起点和终点,而不是它们的执行。在此示例中,进程A的端点与进程B的起始点同步:

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

另一方面,异步进程的起始点和终点没有同步:

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

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

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


33
投票

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

小例子:

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

  1. 从硬盘获取压缩的歌曲
  2. 解压缩音频。
  3. 播放未压缩的音频。

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

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


22
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.