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
仍在运行时(在后台,在一个单独的线程中)执行B
, C
和/或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涉及三个步骤:
- 从硬盘获取压缩的歌曲
- 解压缩audio。
- 播放未压缩的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执行 : 代码块中的所有任务不是全部同时执行。