异步执行和同步执行有什么区别?
异步执行和同步执行有什么区别?
关闭。这个问题需要更加集中的注意力。它当前不能接受回答。
锁定。这个问题及其回答被锁定,因为这个问题是不相关的,但是有历史意义。它当前不能接受新的回答或互动。
异步执行和同步执行有什么区别?
同步/异步与多线程无关。
同步指“连接”或以某种方式“依赖”于另一任务。换句话说,两个同步任务必须知道彼此,其中一个任务在某种依赖于另一个任务的方式下执行,例如等待另一个任务完成才开始执行。
异步指它们完全独立,两者都不必以任何方式考虑对方,无论是在启动还是执行方面。
同步(一个线程):
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和一个执行线程的计算机也可以编写,使其在第一个任务完成之前启动第二个任务的处理。唯一的标准是一个任务的结果不需要作为另一个任务的输入。只要任务的开始和结束时间重叠(如果两个输出都不是另一个的输入,则可能仅此),它们正在异步执行,无论使用多少线程都是一样的。
同步例子:
包含多个任务的任何过程,这些任务必须按顺序执行,但其中一个必须在另一台机器上执行(提取和/或更新数据,从金融服务获取股票报价等)。如果它在另一台机器上,它就在另一个线程上,无论是同步还是异步。
当您同步执行某项任务时,在开始另一项任务之前,您需要等待它完成。当您异步执行某项任务时,您可以在其完成之前开始执行其他任务。
在操作系统的上下文中,这对应于在“线程”上执行进程或任务。 线程是一系列命令(一块代码)的集合,作为一个完成工作的单元。 操作系统在处理器核心上运行给定的线程。 然而,一个处理器核心一次只能执行一个线程。 它没有并行运行多个线程的概念。 操作系统通过每个线程运行一小段时间(例如1ms)并不断切换线程来提供同时执行多个线程的假象。
现在,如果将多个处理器核心引入其中,则线程可以同时执行。 操作系统可以将一段时间分配给第一个处理器核心上的一个线程,然后将相同的时间块分配给另一个处理器核心上的另一个线程。所有这些都是为了在您可以在代码中执行其他任务的同时,允许操作系统管理您的任务的完成。
异步编程是一个复杂的主题,因为当您可以同时执行它们时,事物如何联系在一起的语义。 关于这个主题,有许多文章和书籍;来看一看吧!