异步与同步执行的真正含义是什么?

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

答案

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

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

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

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

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

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

同步(一个线程):

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

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

简单来说:

同步

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

异步

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

类推简单说明

同步执行

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

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

异步执行

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

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

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

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

开始 A->B->C->D-> 等待 A完成

好处是您可以在A仍在运行时(在后台,在单独的线程中)执行BCD ,因此您可以更好地利用资源并减少 “挂起” 或 “等待” 时间。

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

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

异步过程,在另一方面, 没有自己的起点和终点同步:

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

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

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

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

举个例子:

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

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

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

小例子:

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

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

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

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

中的同步和异步操作与代码执行顺序有关

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

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

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

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

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

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