Answers:
当您同步执行某项任务时,您需要等待其完成才能继续执行其他任务。当您异步执行某些操作时,您可以在完成其他任务之前继续进行。
就是说,在计算机上下文中,这转化为在另一个“线程”上执行进程或任务。线程是作为工作单元存在的一系列命令(代码块)。操作系统可以管理多个线程并为一个线程分配一个处理器时间(“片”),然后再切换到另一个线程以轮流执行一些工作。在其核心(请原谅),处理器可以简单地执行命令,而没有一次执行两件事的概念。操作系统通过将时间片分配给不同的线程来模拟这一点。
现在,如果您将多个内核/处理器引入混合,那么事情实际上可能同时发生。操作系统可以将时间分配给第一个处理器上的一个线程,然后将相同的时间块分配给不同处理器上的另一个线程。所有这些都是关于允许操作系统管理代码的完成,同时您可以继续执行代码并执行其他操作。
异步编程是一个复杂的主题,因为在您可以同时进行处理时,它们将如何联系在一起。关于这一主题的文章和书籍很多。看一看!
同步/异步与多线程无关。
同步或同步意味着以某种方式“连接”或“依赖”。换句话说,两个同步任务必须彼此了解,并且一个任务必须以依赖于另一任务的某种方式执行,例如等待启动,直到另一任务完成。
异步意味着它们是完全独立的,在启动或执行中,任何人都不能以任何方式考虑对方。
同步(一个线程):
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--------->|
<
,>
字符。|
从技术上讲,同步/异步的概念实际上与线程无关。虽然,在一般情况下,这是不寻常找到相同的线程上运行的异步任务,这是可能的,(见下面的例子),这是常见的发现上同步执行两个或多个任务单独的线程......不,概念同步/异步的唯一性仅取决于是否可以在另一个(第一个)任务完成之前启动第二个或后续任务,或者是否必须等待。就这些。与执行任务的线程(或多个线程),进程或CPU或实际上与什么硬件无关。的确,为此,我已经编辑了图形以显示这一点。
异步示例:
在解决许多工程问题时,该软件旨在将整个问题分解为多个单独的任务,然后异步执行它们。逆矩阵或有限元分析问题就是很好的例子。在计算中,对列表进行排序是一个示例。例如,快速排序例程将列表分成两个列表,并对每个列表执行一个快速排序,然后递归调用自身(快速排序)。在以上两个示例中,两个任务可以(并且经常)异步执行。它们不必位于单独的线程上。即使具有一个CPU和仅一个执行线程的机器也可以被编码为在第一个任务完成之前启动第二个任务的处理。唯一的标准是,一项任务的结果不必作为另一项任务的输入。只要任务的开始时间和结束时间重叠(仅当两个任务的输出都不需要作为另一个的输入时才有可能),无论正在使用多少个线程,它们都是异步执行的。
同步示例:
由多个任务组成的任何过程,其中必须按顺序执行任务,但必须在另一台计算机上执行(获取和/或更新数据,从金融服务获取股票报价等)。如果在单独的计算机上,则在同步或异步的单独线程上。
简单来说:
同步
您正在排队购买电影票。在面前的每个人都得到一票之前,您无法获得一票,排队在您后面的人也是如此。
异步
您和许多其他人一起在餐厅中。您点菜。其他人也可以点餐,他们不必等待您的食物煮熟并为您服务就可以点菜。在厨房,餐厅的工作人员正在不断做饭,上菜并接受订单。人们将在煮熟后立即食用食物。
同步执行
我的老板很忙。他叫我写代码。我告诉他:很好。我开始了,他像秃鹰一样看着我,站在我的身后,从我的肩膀上移开。我就像“老兄,WTF:当我完成此操作时,为什么不去做点什么?”
他说:“不,我在这里等你完成。” 这是同步的。
异步执行
老板告诉我去做,而不是在那儿等我的工作,而是去做其他事情。当我完成工作后,我只是向老板报告,说:“我做完了!” 这是异步执行。
(请听取我的建议:切勿与身后的老板一起工作。)
同步执行意味着执行在单个序列中进行。 A->B->C->D
。如果要调用这些例程,A
则将运行,然后完成,然后B
将开始,然后完成,然后C
将开始,依此类推。
使用异步执行,您可以开始一个例程,并在开始下一个例程时使其在后台运行,然后在某个时候说“等待此过程完成”。更像是:
开始 A->B->C->D->
等待了A
到结束
其优点是可以执行的B
,C
和或D
同时A
仍在运行(在后台运行,在单独的线程),所以你可以把你的资源更好的优势,有较少的“挂起”或“等待”。
简而言之,同步是指两个或多个进程的起点和终点,而不是它们的执行。在此示例中,进程A的端点与进程B的起点同步:
同步 | -------- A -------- | | -------- B -------- |
异步进程,而另一方面,也不能有自己的起点和终点同步:
异步 | -------- 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
因为进行异步调用的方法将立即继续下一行代码。我说“可以”,因为异步操作无法保证执行顺序。根据线程的时间等,它也可以作为原始文件执行。
同步和异步操作是关于与当前任务相关的新任务的执行顺序。桌上有两个任务:当前任务和新任务
同步(阻塞)-意味着任务将被一一执行。仅在前一个任务完成后才开始下一个任务。Task 2
直到Task 1
完成才开始
异步(非阻塞)–意味着任务立即返回控制,并承诺执行代码并稍后通知结果(例如回调,功能)。Task 2
即使Task 1
没有完成也被执行
简单地说,异步执行是在后台执行操作。
例如,如果您想从Internet下载文件,则可以使用同步功能来执行此操作,但是它将阻塞线程,直到文件下载完成。这会使您的应用程序无法响应任何用户输入。
相反,您可以使用异步方法在后台下载文件。在这种情况下,下载功能将立即返回,程序将继续正常执行。所有下载操作均在后台完成,程序完成后会通知您。
举一个非常简单的例子
同步
想象一下,有3名学生指示在道路上进行接力赛。
第一名学生跑出给定的距离,停下来,将接力棒传递到第二名。没有其他人开始运行。
1------>
2.
3.
当第二名学生取回警棍时,她开始跑给定的距离。
1.
2------>
3.
第二名学生解开了鞋带。现在她已经停下并再次绑起来。因此,第二名的结束时间延长了,第三名的开始时间有所延迟。
1.
--2.--->
3.
这种模式一直持续到第三名从第二名取回警棒并结束比赛为止。
异步
试想一下,有10个人随机走在同一条路上。他们当然不会排队,只是以不同的节奏随机地走在路上的不同地方。
第二个人的鞋带解开了。她停下来重新绑起来。
但是没有人在等她把它绑起来。其他所有人仍以他们以前的相同步伐行走。
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
当执行如下序列时:a> b> c> d>,如果在执行过程中遇到失败,例如:
a
b
c
fail
然后我们从头开始:
a
b
c
d
这是同步的
但是,如果执行的顺序相同:a> b> c> d>,并且中间出现故障:
a
b
c
fail
...但不是从头开始,而是从故障点重新开始:
c
d
...这就是异步的。
您将“同步与并行vs系列”混为一谈。同步意味着所有同时。彼此相关的同步化意味着可以串联或以固定的间隔进行。在程序执行所有操作时,它会顺序运行。获取字典...这就是为什么我们有不甜的茶。您喝茶或加糖茶。
基本上,同步意味着您一次只能执行一件事。异步意味着您可以一次执行多个任务,而不必继续执行当前的任务即可继续进行下一个任务。
使用说明做早餐的例子
如果您有烹饪经验,则可以异步执行这些指令。您将开始加热锅中的鸡蛋,然后开始培根。您将面包放进烤面包机,然后开始放鸡蛋。在该过程的每个步骤中,您都将启动一个任务,然后将注意力转移到可以引起注意的任务上。
做早餐是一个很好的例子,说明异步工作不是并行的。一个人(或线程)可以处理所有这些任务。继续早餐的比喻,一个人可以通过在第一个任务完成之前启动下一个任务来异步制作早餐。无论有人在看菜,烹饪都会进行。一旦开始加热锅中的鸡蛋,就可以开始煎培根了。培根开始后,就可以将面包放进烤面包机了。
对于并行算法,您需要多个库克(或线程)。一个人做鸡蛋,一个人做培根,依此类推。每个人只会专注于一项任务。每个厨师(或线程)都将被同步阻止,以等待培根准备翻转或吐司吐司。
异步编程概念的参考
关于同步执行的“ 同时 ”定义(有时会令人困惑),这是一种理解的好方法:
同步执行:代码块中的所有任务都同时执行。
异步执行:代码块中的所有任务不会同时执行。