Ada*_*son 1670
当您同步执行某些操作时,请等待它完成,然后再继续执行其他任务.当您异步执行某些操作时,可以在完成之前继续执行另一个任务.
话虽如此,在计算机环境中,这转化为在另一个"线程"上执行进程或任务.线程是作为工作单元存在的一系列命令(代码块).操作系统可以管理多个线程,并在切换到另一个线程之前为线程分配处理器时间的一部分("切片"),以便轮流做一些工作.在它的核心(原谅双关语),处理器可以简单地执行一个命令,它没有一次做两件事的概念.操作系统通过将时间片分配给不同的线程来模拟这一点.
现在,如果你在混合中引入多个核心/处理器,那么事情实际上可能同时发生.操作系统可以将时间分配给第一个处理器上的一个线程,然后将相同的时间块分配给另一个处理器上的另一个线程.所有这一切都是为了让操作系统能够管理您的任务完成,同时您可以继续执行代码并执行其他操作.
异步编程是一个复杂的主题,因为当你可以同时执行它们时,事物如何结合在一起的语义.有很多关于这个主题的文章和书籍; 看一看!
Cha*_*ana 1098
同步/异步无需多线程.
同步或同步意味着以某种方式"连接"或"依赖".换句话说,两个同步任务必须彼此了解,并且一个任务必须以某种方式执行,这取决于另一个任务,例如等待启动直到另一个任务完成.
异步意味着它们是完全独立的,无论是在启动还是执行中,都不能以任何方式考虑对方.
同步(一个线程):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Run Code Online (Sandbox Code Playgroud)
同步(多线程):
thread A -> |<---A---->|
\
thread B ------------> ->|<----B---------->|
\
thread C ----------------------------------> ->|<------C----->|
Run Code Online (Sandbox Code Playgroud)
异步(一个线程):
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-->|
Run Code Online (Sandbox Code Playgroud)
异步(多线程):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
Run Code Online (Sandbox Code Playgroud)
<,>字符.|从技术上讲,同步/异步的概念实际上与线程没有任何关系.虽然通常情况下,发现在同一个线程上运行的异步任务是不寻常的,但有可能(参见下面的示例)并且通常会发现两个或多个任务在不同的线程上同步执行...不,这个概念同步/异步只需要在另一个(第一)任务完成之前是否可以启动第二个或后续任务,或者它是否必须等待.就这些.什么线程(或线程),进程或CPU,或者实际上,执行任务的硬件是什么并不重要.实际上,为了说明这一点,我已经编辑了图形以显示这一点.
异步的例子.在解决许多工程问题时,该软件旨在将整个问题分解为多个单独的任务,然后异步执行.反转矩阵或有限元分析问题就是很好的例子.在计算中,排序列表就是一个例子.例如,快速排序例程将列表拆分为两个列表,并通过递归调用自身对每个列表进行排序.在上面的两个例子中,两个任务可以(并且经常是)异步执行.它们不需要在单独的线程上.即使是具有一个CPU的机器,也只有一个执行线程可以编码,以便在第一个任务完成之前启动第二个任务的处理.唯一的标准是一个任务的结果不必作为另一个任务的输入.只要任务的开始和结束时间重叠,(只有当两者的输出都不需要作为另一个的输入时),它们才会异步执行,无论使用多少线程.
同步示例.任何由多个任务组成的进程,其中任务必须按顺序执行,但必须在另一台机器上执行(获取和/或更新数据,从金融服务获取股票报价等).如果它位于单独的机器上,则它位于单独的线程上,无论是同步还是异步.
the*_*ien 614
简单来说:
同步
你在队列中获得电影票.在你面前的每个人得到一个之前你不能得到一个,这同样适用于排在你后面的人.
异步
你和许多其他人在一家餐馆.你点了食物.其他人也可以订购他们的食物,他们没有必要等待你的食物烹饪,并在他们订购之前送达你.在厨房餐厅工作人员不断烹饪,服务和接受订单.一旦煮熟,人们就会得到他们的食物.
BKS*_*eon 310
同步执行
我的老板是一个忙碌的人.他告诉我写代码.我告诉他:好的.我开始了,他正像一只秃鹰一样看着我,站在我身后,从我肩膀上.我喜欢"伙计,WTF:你为什么不去做我做完这件事呢?"
他就像是:"不,我在这儿等你,直到你完成." 这是同步的.
异步执行
老板告诉我这样做,而不是在那里等待我的工作,老板去做其他任务.当我完成工作后,我只是向老板报告说:"我做完了!" 这是异步执行.
(听从我的建议:永远不要和你身后的老板一起工作.)
Ree*_*sey 88
同步执行意味着执行在一个系列中发生. A->B->C->D.如果你正在调用这些例程,A将运行,然后完成,然后B将启动,然后完成,然后C将启动,等等.
使用异步执行,你开始一个例程,让它在你开始下一个时在后台运行,然后在某个时候,说"等待这个完成".它更像是:
开始 A->B->C->D->等待用于A完成
其优点是可以执行的B,C和或D同时A仍在运行(在后台运行,在单独的线程),所以你可以把你的资源更好的优势,有较少的"挂起"或"等待".
Rag*_*czy 54
同步意味着调用者等待响应或完成,异步调用者继续并且响应稍后(如果适用).
举个例子:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
Run Code Online (Sandbox Code Playgroud)
这将始终输出:
Before call
In call
After call
Run Code Online (Sandbox Code Playgroud)
但是,如果我们要使doSomething异步(多种方式),那么输出可能变为:
Before call
After call
In call
Run Code Online (Sandbox Code Playgroud)
因为进行异步调用的方法会立即继续下一行代码.我说"可能",因为使用异步操作无法保证执行顺序.它也可以作为原始执行,具体取决于线程时间等.
ent*_*3te 54
简而言之,同步是指两个或多个进程的起点和终点,而不是它们的执行.在此示例中,进程A的端点与进程B的起始点同步:
SYNCHRONOUS
|--------A--------|
|--------B--------|
异步进程,而另一方面,也不能有自己的起点和终点同步:
ASYNCHRONOUS
|--------A--------|
|--------B--------|
在进程A与进程B重叠的情况下,它们同时或同步运行(字典定义),因此产生混淆.
更新:Charles Bretana改进了他的答案,所以这个答案现在只是一个简单的(可能过于简化的)助记符.
aJ.*_*aJ. 33
我认为这是有点圆的解释,但它仍然澄清使用现实生活中的例子.
小例子:
假设播放音频涉及三个步骤:
如果您的音频播放器按顺序为每首歌曲执行步骤1,2,3,则它是同步的.您将不得不等待一段时间才能听到这首歌,直到该歌曲实际被取出并解压缩.
如果您的音频播放器执行步骤1,2,3彼此独立,那么它是异步的.即.在播放音频1(步骤3)时,如果它并行地从硬盘中取出音频3(步骤1)并且它并行地解压缩音频2.(步骤2)你最终会听到这首歌,而无需等待获取和解压缩.
yoA*_*ex5 24
同步编程模型 - 将线程分配给一个任务并开始处理它.任务完成后,它可用于下一个任务.在这个模型中,它不能让执行任务处于中间以承担另一个任务.让我们讨论一下这个模型在单线程和多线程环境中的工作原理.
单线程 - 如果我们要处理几个任务并且当前系统只提供一个线程,那么任务将逐个分配给线程.它可以用图形描绘为

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

异步编程模型 - 与同步编程模型相反,这里一个线程一旦开始执行一个任务就可以将它保存在中间,保存当前状态并开始执行另一个任务.
Mic*_*ski 23
简单地说异步执行就是在后台做事.
例如,如果要从Internet下载文件,可以使用同步函数来执行此操作,但它会阻止您的线程,直到文件完成下载.这可能会使您的应用程序无法响应任何用户输入.
相反,您可以使用异步方法在后台下载该文件.在这种情况下,下载功能立即返回,程序执行正常继续.所有下载操作都在后台完成,程序完成后会通知您.
Das*_*tha 15
作为一个非常简单的例子,
同步
想象一下,10名学生被指示在路上排队等候.
第三个学生解开了她的鞋带.现在她已经停止并再次绑起来.
她身后的所有学生都已经停了下来,现在正等着她把它绑起来.第一和第二名学生已经走过所有人,并继续按照他们的平常步伐.
1------>
2.
3.
Run Code Online (Sandbox Code Playgroud)
异步
想象一下10个随机的人走在同一条路上.他们当然不在队列中,只是随意地以不同的步伐在路上的不同地方行走.
第三人的鞋带解开了.她停下来再把它绑起来.
但是没有人在等她把它捆绑起来.其他人仍然以他们以前的方式行走,与他们同样的步伐.
1.
2------>
3.
Run Code Online (Sandbox Code Playgroud)
小智 14
执行如下序列时:a> b> c> d>,如果我们在执行过程中遇到失败,例如:
a
b
c
fail
Run Code Online (Sandbox Code Playgroud)
然后我们从头开始重新开始:
a
b
c
d
Run Code Online (Sandbox Code Playgroud)
这是同步的
但是,如果我们执行相同的序列:a> b> c> d>,我们在中间失败:
a
b
c
fail
Run Code Online (Sandbox Code Playgroud)
...但是我们不是从头重新开始,而是从故障点重新开始:
c
d
Run Code Online (Sandbox Code Playgroud)
......这被称为异步.
Abo*_*ian 13
我创建了一个gif来解释这一点,希望对您有所帮助:外观,第3行是异步的,其他行是同步的。第3行之前的所有行都应等待,直到第3行完成工作为止,但是由于第3行是异步的,因此下一行(第4行)不要等待第3行,而第5行则应等待第4行完成其工作,第6行应等待第5行和第7行等待6行,因为第4、5、6、7行不是异步的。

小智 7
您将Synchronous与Parallel vs Series混淆.同步意味着所有的同时.同步化意味着与每个领域相关,这可以意味着串联或以固定间隔.虽然程序正在全力以赴,但它是串行运行的.得到一本字典......这就是为什么我们有不甜的茶.你有茶或加糖茶.
使用说明做早餐的例子
如果您有烹饪经验,则可以异步执行这些指令。您将开始加热锅中的鸡蛋,然后开始培根。您将面包放进烤面包机,然后开始放鸡蛋。在该过程的每个步骤中,您都将开始一个任务,然后将注意力转移到可以引起注意的任务上。
做早餐是一个很好的例子,说明异步工作不是并行的。一个人(或线程)可以处理所有这些任务。继续进行早餐类比,一个人可以通过在第一个任务完成之前启动下一个任务来异步制作早餐。无论有人在看菜,烹饪都会进行。一旦开始加热锅中的鸡蛋,就可以开始煎培根了。培根开始后,就可以将面包放进烤面包机了。
对于并行算法,您需要多个库克(或线程)。一个人做鸡蛋,一个人做培根,依此类推。每个人只会专注于一项任务。每个厨师(或线程)将被同步阻止,以等待培根准备翻转或吐司吐司。
异步编程概念的参考
| 归档时间: |
|
| 查看次数: |
838733 次 |
| 最近记录: |