asynchronous与同步执行,这是什么意思?

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

当你同步执行某个东西的时候,你需要等待它完成之后才能继续执行另一个任务。 当你asynchronous执行某些东西时,可以在完成之前转移到另一个任务。

也就是说,在计算机环境中,这意味着执行另一个“线程”上的进程或任务。 线程是一系列作为工作单元存在的命令(一段代码)。 操作系统可以pipe理多个线程,并且在切换到另一个线程之前给一个线程分配一个处理器时间片(“片”),以便轮到做一些工作。 在处理器的核心(赦免双关语)中,处理器可以简单地执行一个命令,它没有同时做两件事的概念。 操作系统通过为不同线程分配时间片来模拟这一点。

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

asynchronous编程是一个复杂的话题,因为当你可以同时执行时,它们是如何相互联系的。 关于这个问题有很多文章和书籍。 看一看!

同步/asynchronous无法使用multithreading。

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

同步(一个线程):

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

同步(multithreading):

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

asynchronous(一个线程):

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

asynchronous(multithreading):

  thread A -> |<---A---->| thread B -----> |<----B---------->| thread C ---------> |<------C--------->| 
  • <>字符表示的任务A,B,C的开始点和结束点。
  • 由垂直条表示的CPU时间片|

从技术上讲,同步/asynchronous的概念实际上与线程没有任何关系 。 虽然通常在同一个线程上findasynchronous任务是很不寻常的,但是有可能(见下面的例子), 通常单独的线程上同时执行两个或多个任务。不,概念的同步/asynchronous只能在第二个或后续任务能否在另一个(第一个)任务完成之前启动,或者是否必须等待。 就这些。 什么线程(或线程),进程或CPU,或者甚至是什么硬件,执行的任务是不相关的。 的确,为了说明这一点,我编辑了graphics来展示这一点。

asynchronous的例子。 在解决许多工程问题时,软件被devise成将整体问题分解成多个单独的任务,然后asynchronous执行它们。 反转matrix或有限元分析问题就是很好的例子。 在计算中,sorting列表就是一个例子。 例如,快速sorting例程将列表拆分成两个列表,并通过recursion调用来对它们进行sorting。 在上面的两个例子中,这两个任务可以(也经常是)asynchronous执行。 他们不需要分开的线程。 即使是只有一个CPU的机器,只有一个执行线程也可以被编码,以在第一个任务完成之前开始处理第二个任务。 唯一的标准是一个任务的结果不需要作为另一个任务的input 。 只要任务的开始和结束时间重叠(只要两者的输出不需要作为另一个的input),它们就会被asynchronous执行,无论使用多less个线程。

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

简单地说:

同步

你在排队获得电影票。 在你面前的每个人都得到一个,你不能得到一个,对你后面排队的人也一样。

asynchronous

你和其他很多人在一家餐馆里。 你点你的食物。 其他人也可以点菜,他们可以在点菜之前不用等待你的食物煮熟和送达给你。 在厨房餐厅工作人员不断烹饪,服务和接受订单。 人们一煮熟即可食用。

我会尽量简单地解释,所以你会(希望)记住:

同步执行

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

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

asynchronous执行

老板告诉我这样做,而不是在那里等待我的工作,老板开始做其他事情。 当我完成工作时,我只是向我的老板报告,并说:“我完成了!” 这是asynchronous执行。

真的很简单! 希望它有帮助。

(请听我的build议:永远不要和你背后的老板合作。)

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

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

启动 A->B->C->D-> 等待 A完成

其优点是可以在A仍在运行时(在后台,在一个单独的线程中)执行BC和/或D ,这样可以更好地利用资源并减less“挂起”或“等待”。

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

举个例子:

  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 

但是如果我们要做一些asynchronous的事情(多种方法),那么输出结果可能会变成:

 Before call After call In call 

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

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

小例子:

假设播放audio涉及三个步骤:

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

如果您的audio播放器为每首歌曲按顺序执行1,2,3,那么它是同步的。 您将不得不等待一段时间才能听到歌曲,直到歌曲实际获取并解压。

如果你的audio播放器相互独立地执行1,2,3步,那么它是asynchronous的。 即。 当播放audio1(步骤3)时,如果它并行地从硬盘中取出audio3(步骤1),并且它并行地解压缩audio2。 (第2步)您将听到歌曲,而不用等待太多的提取和解压缩。

简而言之,同步是指两个或多个进程的开始结束点,而不是它们的执行 。 在这个例子中,进程A的端点与进程B的开始点同步:

同步
    | -------- --------一个|
                      | -------- --------乙|

另一方面,asynchronous进程没有同步的开始和结束点:

asynchronous
    | -------- --------一个|
          | -------- --------乙|

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

考虑“asynchronous和同步过程 ”而不是“asynchronous和同步执行 ”可能会有帮助。

简单地说,asynchronous执行是在后台做东西。

例如,如果你想从互联网上下载文件,你可能使用同步function来做到这一点,但它会阻止你的线程,直到文件完成下载。 这可能会使您的应用程序无法响应任何用户input。

相反,您可以使用asynchronous方法在后台下载文件。 在这种情况下,下载函数立即返回,程序继续正常执行。 所有的下载操作都是在后台完成的,并且程序在完成时会被通知。

当执行像a> b> c> d>这样的序列时,如果在执行过程中出现故障,如:

 a b c fail 

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

 a b c d 

这是同步的

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

 a b c fail 

…但不是从一开始就重新开始,我们从失败的angular度重新开始:

 c d 

这是知道的asynchronous。

您正在混淆同步与并行VS系列。 同时意味着所有的同时。 同步化手段涉及到每一个可以串联或固定间隔的意思。 当程序完成时,它会连续运行。 得到一本词典…这就是为什么我们不喝茶。 你有茶或甜茶。

同步基本上意味着你一次只能执行一件事情。 asynchronous意味着你可以一次执行多件事情,而不必为了继续下一件事情而执行当前的事情。

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

asynchronous操作在返callback用者之后(大部分或全部)工作。

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

同步

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

第三名学生解开鞋带。 现在她已经停下来再捆绑起来。

在她后面的所有学生都已经停下来了,现在正在等待她的结束。 第一和第二名学生已经走过了他们,按照惯常的步调继续前进。

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

asynchronous

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

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

但没有人等着她把它绑起来。 其他人仍然以同样的速度走他们以前的样子。

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

同步 :同步执行任务时,您需要等待任务完成,然后再继续执行其他任务。 一个任务取决于另一个任务的结束

asynchronous :当任务asynchronous执行时,可以在前一个任务完成之前直接切换到另一个任务。 一个任务不依赖于另一个。

在编程中,任务在“ 线程 ”上执行。 有必要了解可以为任务创build多个线程,以避免堆叠在单个队列中。

话虽如此,同步和asynchronous的概念与线程没有多大关系,我提到它的原因是很难看到任务在单个线程上asynchronous运行(虽然在技术上是可行的)。

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

同步执行一段代码内的所有任务都是同时执行的。

asynchronous执行代码块中的所有任务不是全部同时执行。