异步与同步执行的真正含义是什么?[关闭]


1186

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


...或“顺序还是并行”执行...尽管真正的并行需要多个内核,否则在逻辑上是交错的。
samis

8
我曾经把这两个术语弄混了,我记得的区别是在异步的“ A JAX”中抛出了第一个“ A” ,在JavaScript中,当您用循环请求AJAX时,它们就不会等待因为浏览器不想影响冻结网站的用户体验,因此几乎在同一时间发送所有请求,而不必等待先前请求的响应。那是异步的
会计师م19年

Answers:


1746

当您同步执行某项任务时,您需要等待其完成才能继续执行其他任务。当您异步执行某些操作时,您可以在完成其他任务之前继续进行。

就是说,在计算机上下文中,这转化为在另一个“线程”上执行进程或任务。线程是作为工作单元存在的一系列命令(代码块)。操作系统可以管理多个线程并为一个线程分配一个处理器时间(“片”),然后再切换到另一个线程以轮流执行一些工作。在其核心(请原谅),处理器可以简单地执行命令,而没有一次执行两件事的概念。操作系统通过将时间片分配给不同的线程来模拟这一点。

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

异步编程是一个复杂的主题,因为在您可以同时进行处理时,它们将如何联系在一起。关于这一主题的文章和书籍很多。看一看!


246
绝对让我感到困惑的是,同步是“同时”的意思,但是在上述意义上使用时,则是顺序的,而异步是“不是同时”的意思……?有人可以解释这个冲突吗?
Damien Roche

45
@Zenph:在这种情况下,我们关注的是整个代码块。同步意味着该块同时执行(尽管是的,组件是顺序执行的)。异步意味着该块不会在同一时间全部执行。
亚当·鲁滨逊

8
当程序将消息发送到队列时(例如,在消息传递系统中,例如ActiveMQ,WebSphere MQ,HornetQ,MSMQ等),异步执行也会发生。在这种情况下,异步调用不涉及多线程编程或在OS级别处理并发性。
Paulo Merson

287
奇怪的是,“同步”意味着“使用相同的时钟”,因此当两个指令同步时,它们使用相同的时钟,并且必须一个接一个地发生。“异步”是指“不使用相同的时钟”,因此指令与彼此之间的步调无关。这就是为什么它向后看的原因,该术语不是指彼此之间的指令关系。它指的是每个指令与时钟的关系。希望能有所帮助。
汤姆·帕迪拉


1150

同步/异步与多线程无关。

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

同步(一个线程):

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和仅一个执行线程的机器也可以被编码为在第一个任务完成之前启动第二个任务的处理。唯一的标准是,一项任务的结果不必作为另一项任务的输入。只要任务的开始时间和结束时间重叠(仅当两个任务的输出都不需要作为另一个的输入时才有可能),无论正在使用多少个线程,它们都是异步执行的。

同步示例:

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


92
为什么世界上单词在计算机中的含义不同……总是让我回到…………从字典中开始……同步:同时发生。异步:不同时发生。
穆罕默德·乌默尔2013年

17
但正如您在计算机中看到的那样,情况恰恰相反
穆罕默德·乌默尔

5
也许该术语基于任务的启动是否与其他任务的完成“同步”?
查尔斯·布雷塔纳

11
@MuhammadUmer:在计算机世界中,同时发生的事件称为并发。
罗伊·灵

5
恕我直言,这些图片并不能全部描述任务的同步执行与异步执行。例如,第二张图片暗示异步任务需要多个线程。实际上,事实并非如此。而且这些任务必须并行运行,这也不是必需的。或者,“同步”图片很好地显示了如何从某些呼叫站点异步调度任务,现在如何在串行任务调度程序中执行任务;)IMO,这些图片具有误导性。
CouchDeveloper 2015年

641

简单来说:

同步

您正在排队购买电影票。在面前的每个人都得到一票之前,您无法获得一票,排队在您后面的人也是如此。

异步

您和许多其他人一起在餐厅中。您点菜。其他人也可以点餐,他们不必等待您的食物煮熟并为您服务就可以点菜。在厨房,餐厅的工作人员正在不断做饭,上菜并接受订单。人们将在煮熟后立即食用食物。


10
与苹果相比,有人要苹果吗?如果您希望餐厅场景是同步的,那么当您点菜时,餐厅中的其他每个人都必须等待食物到达才能点菜,等等。现在看来,这真是一个愚蠢的场景,但是在计算世界中,这种情况可能会有用。假设每个客户无法决定他们想要什么,而是想看看以前的客户订购什么来决定他们是否想要,那么有意义的是,他们必须等待食物到达后再订购。
Fonix

只是要补充一下……它可以使这些操作像在异步操作中的队列中一样执行……但这根本不是强制性的。
Sreekanth Karumanaghat

5
非常简单和真实的例子
Manish

为了进一步推动您的榜样,他们可以考虑出售门票的几个门。因此,每条线可以与另一条线异步工作,但在其内部却可以同步工作!
Saeed Ahadian

334

类推简单说明

同步执行

我的老板很忙。他叫我写代码。我告诉他:很好。我开始了,他像秃鹰一样看着我,站在我的身后,从我的肩膀上移开。我就像“老兄,WTF:当我完成此操作时,为什么不去做点什么?”

他说:“不,我在这里等你完成。” 这是同步的。

异步执行

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

(请听取我的建议:切勿与身后的老板一起工作。)


28
我做完了...当您以辞职为由时,它甚至更有趣。
Daedric

91

同步执行意味着执行在单个序列中进行。 A->B->C->D。如果要调用这些例程,A则将运行,然后完成,然后B将开始,然后完成,然后C将开始,依此类推。

使用异步执行,您可以开始一个例程,并在开始下一个例程时使其在后台运行,然后在某个时候说“等待此过程完成”。更像是:

开始 A->B->C->D->等待A到结束

其优点是可以执行的BC和或D同时A仍在运行(在后台运行,在单独的线程),所以你可以把你的资源更好的优势,有较少的“挂起”或“等待”。


@ Reed Copsey ......谢谢您的这么好的解释.....只想了解有关Async-Exec的更多信息... ......基于您在Async Exec中的回答....开始A-> B-> C-> D->等待A完成...因此所有A,B,C,D一次开始......并且它们等待A完成..... B将仅在A完成之后完成,而C将在B之后完成,依此类推……?还是B可以先完成然后A可以完成?
Devrath

8
@Devrath操作可以按任何顺序完成。
Reed Copsey 2013年

59

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

同步
   | -------- A -------- |
                     | -------- B -------- |

异步进程,而另一方面,也不能有自己的起点和终点同步:

异步
   | -------- A -------- |
         | -------- B -------- |

在进程A与进程B重叠的地方,它们同时或同步运行(字典定义),因此造成混乱。

更新:查尔斯·布雷塔纳(Charles Bretana)改进了他的答案,所以现在这个答案只是一个简单的(可能过于简化)助记符。


2
查尔斯·布雷塔纳答案的副本
迪内什·塞尼

2
@DineshSaini-我的图略有不同。为了清楚起见,在这两种情况下,我都将A置于B之上,强调它们的起点和终点是否同步。查尔斯·布雷塔纳(Charles Bretana)的图将同步过程按顺序放置,而无需“同步”任何东西。(我打算在他的回答下方评论“改进”它,但意识到仅显示新图会更容易。)
entr0p3te 2015年

很棒的图。我认为调用最高级SYNC的方式是,在顶部图中,A的开始和结束实际上是在同一时间进行的,这意味着没有其他事件干预或可能会干扰A的完成。同步可以孤立地引用单个任务,例如添加到CPU寄存器中,其开始和结束非常接近,从而实际上可以与字典同步。
Dean Radcliffe

55

同步意味着呼叫者等待响应或完成,异步意味着呼叫者继续并随后出现响应(如果适用)。

举个例子:

    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

因为进行异步调用的方法将立即继续下一行代码。我说“可以”,因为异步操作无法保证执行顺序。根据线程的时间等,它也可以作为原始文件执行。


34

我认为这是一些四处循环的解释,但仍使用实际示例进行了阐明。

小例子:

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

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

如果您的音频播放器为每首歌曲依次执行步骤1,2,3,则它是同步的。您将需要等待一段时间才能听到这首歌,直到实际提取并解压缩了这首歌为止。

如果您的音频播放器彼此独立执行步骤1,2,3,则它是异步的。即。在播放音频1时(步骤3),如果它从硬盘上并行获取音频3(步骤1)并并行解压缩音频2。(第2步)您将无需等待太多的提取和解压缩就可以听到这首歌。


32

同步和异步操作是关于与当前任务相关的新任务的执行顺序。桌上有两个任务:当前任务和新任务

同步(阻塞)-意味着任务将被一一执行。仅在前一个任务完成后才开始下一个任务。Task 2直到Task 1完成才开始

异步(非阻塞)–意味着任务立即返回控制,并承诺执行代码并稍后通知结果(例如回调,功能)。Task 2即使Task 1没有完成也被执行

关于同步和异步的SO答案:在iOS中在Android中


同步多线程示例中的图似乎描绘了同时执行的线程?
samis

@sαmosΛris,您可以考虑使用类似于X轴的线程来指示时间轴
yoAlex5 '18

x轴通常用作空间尺寸;时间的t轴-在算法复杂度分析中发现的重要区别。
samis

23

简单地说,异步执行是在后台执行操作。

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

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


1
您的示例将如何更快。最后,在下载完成之前,您无法播放文件。你可以解释吗?我想我当时不理解异步,可能是我自己,但是当另一个进程正在运行(获取下载)时,另一个步骤或进程会做什么?我的意思是,在您的应用程序中收到异步进程(下载)之前,您可以做什么...我不明白。那么,您仍然必须向用户显示某种等待机制,而无论哪种情况都不会发生?
PositiveGuy

4
不必更快。这是关于不阻塞主线程,以便它可以处理其他类型的用户输入。例如,用户可能要取消下载或同时开始下载另一个文件。
米哈尔皮亚斯科夫斯基

19

举一个非常简单的例子

同步

想象一下,有3名学生指示在道路上进行接力赛。

第一名学生跑出给定的距离,停下来,将接力棒传递到第二名。没有其他人开始运行。

1------>
        2.
                3.

当第二名学生取回警棍时,她开始跑给定的距离。

      1.
        2------>
                3.

第二名学生解开了鞋带。现在她已经停下并再次绑起来。因此,第二名的结束时间延长了,第三名的开始时间有所延迟。

      1.
        --2.--->
                3.

这种模式一直持续到第三名从第二名取回警棒并结束比赛为止。

异步

试想一下,有10个人随机走在同一条路上。他们当然不会排队,只是以不同的节奏随机地走在路上的不同地方。

第二个人的鞋带解开了。她停下来重新绑起来。

但是没有人在等她把它绑起来。其他所有人仍以他们以前的相同步伐行走。

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

18

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


12

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

a
b
c
fail

然后我们从头开始:

a
b
c
d

这是同步的

但是,如果执行的顺序相同:a> b> c> d>,并且中间出现故障:

a
b
c
fail

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

c
d

...这就是异步的。


1
您能否通过为示例提供更多上下文来更精确地表达您的意思
krichard

5
这个答案根本是不正确的。
user207421 '16

7

您将“同步与并行vs系列”混为一谈。同步意味着所有同时。彼此相关的同步化意味着可以串联或以固定的间隔进行。在程序执行所有操作时,它会顺序运行。获取字典...这就是为什么我们有不甜的茶。您喝茶或加糖茶。


3
实际上,“同步”是指指令与时钟之间的关系。不是指令本身之间的关系。这就是为什么向后看“同步”实际上意味着一个接一个的原因:但是指令已与时钟同步。“异步”表示“在任何时候,我都不在乎它何时发生”:指令不需要与时钟同步。是的,有一个字典定义,但是您必须确保定义正确的情况。
汤姆·帕迪拉

1
同步并没有在计算指“在同一时间”。您将同步与同步混淆在一起,将茶与甜茶的“并行与串联”混淆了。答案毫无意义。
user207421'8

7

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


并非同时执行的多个事情称为多线程而不是异步。
Sreekanth Karumanaghat

7

使用说明做早餐的例子

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

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

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

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

异步编程概念的参考



1

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

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

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


我想这个更多,如果你“的同时有效地”表示同意,或“实际用途”。我想downvote是为不准确的陈述,事情确实越来越在同一TIEM完成。
Dean Radcliffe

1

我认为一个不错的方式是经典的接力赛

同步:流程就像同一团队的成员一样,直到收到接力棒(上一个流程/运行者的执行结束)之后,它们才会执行,但是它们彼此同步。

异步:在同一个接力赛道上,像不同团队的成员一样的流程,它们将运行和停止,彼此异步,但在同一种族内(整个程序执行)。

是否有意义?


1

同步的另一个英语定义在这里

坐标; 结合。

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

因此,异步任务不与其他任务协调,而同步任务与其他任务协调,因此一个任务先于另一个任务完成。

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


0

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.