协慌网

登录 贡献 社区

异步与同步执行,它到底意味着什么?

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

答案

当您同步执行某些操作时,请等待它完成,然后再继续执行其他任务。当您异步执行某些操作时,可以在完成之前继续执行另一个任务。

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

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

异步编程是一个复杂的主题,因为当你可以同时执行它们时,事物如何结合在一起的语义。有很多关于这个主题的文章和书籍; 看一看!

同步 / 异步无需多线程。

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

同步(一个线程):

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

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

简单来说:

同步

你在队列中获得电影票。在你面前的每个人得到一个之前你不能得到一个,这同样适用于排在你后面的人。

异步

你和许多其他人在一家餐馆。你点了食物。其他人也可以订购他们的食物,他们没有必要等待你的食物烹饪,并在他们订购之前送达你。在厨房餐厅工作人员不断烹饪,服务和接受订单。一旦煮熟,人们就会得到他们的食物。