异步执行和同步执行之间的区别是什么?
当前回答
同步/异步与多线程无关。
同步或同步意味着“连接”,或在某种程度上“依赖”。换句话说,两个同步任务必须彼此知道,并且一个任务必须以依赖于另一个任务的某种方式执行,例如等待开始,直到另一个任务完成。 异步意味着它们是完全独立的,任何一方都不能以任何方式考虑另一方,无论是在初始化还是执行中。
同步(一个线程):
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和一个执行线程的机器,也可以在第一个任务完成之前开始第二个任务的处理。唯一的标准是,一个任务的结果不需要作为另一个任务的输入。只要任务的开始时间和结束时间重叠(只有在两个任务的输出都不需要作为另一个任务的输入时才有可能),它们就是异步执行的,不管使用了多少线程。
同步的例子:
由多个任务组成的任何进程,这些任务必须按顺序执行,但其中一个任务必须在另一台机器上执行(获取和/或更新数据,从金融服务获取股票报价,等等)。如果它在单独的机器上,那么它就在单独的线程上,无论是同步的还是异步的。
其他回答
同步基本上意味着一次只能执行一件事情。异步意味着您可以一次执行多个任务,并且不必为了移动到下一个任务而完成当前任务。
同步/异步与多线程无关。
同步或同步意味着“连接”,或在某种程度上“依赖”。换句话说,两个同步任务必须彼此知道,并且一个任务必须以依赖于另一个任务的某种方式执行,例如等待开始,直到另一个任务完成。 异步意味着它们是完全独立的,任何一方都不能以任何方式考虑另一方,无论是在初始化还是执行中。
同步(一个线程):
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和一个执行线程的机器,也可以在第一个任务完成之前开始第二个任务的处理。唯一的标准是,一个任务的结果不需要作为另一个任务的输入。只要任务的开始时间和结束时间重叠(只有在两个任务的输出都不需要作为另一个任务的输入时才有可能),它们就是异步执行的,不管使用了多少线程。
同步的例子:
由多个任务组成的任何进程,这些任务必须按顺序执行,但其中一个任务必须在另一台机器上执行(获取和/或更新数据,从金融服务获取股票报价,等等)。如果它在单独的机器上,那么它就在单独的线程上,无论是同步的还是异步的。
同步是指调用方等待响应或完成,异步是指调用方继续执行并且稍后出现响应(如果适用的话)。
举个例子:
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
因为进行异步调用的方法将立即继续执行下一行代码。我之所以说“可能”,是因为异步操作无法保证执行顺序。它也可以作为原始文件执行,这取决于线程计时等。
以下是制作早餐的说明:
倒一杯咖啡。 烧热平底锅,然后煎两个鸡蛋。 煎三片培根。 烤两片面包。 在吐司上加黄油和果酱。 倒一杯橙汁。 如果你有烹饪经验,你会异步执行这些指令。你会先热锅煎鸡蛋,然后开始煎培根。你把面包放进烤面包机,然后开始煎鸡蛋。在这个过程的每一步,你都要开始一项任务,然后把注意力转移到那些已经准备好的任务上。 做早餐就是一个非并行的异步工作的好例子。一个人(或线程)可以处理所有这些任务。继续早餐的类比,一个人可以异步地做早餐,在第一个任务完成之前开始下一个任务。不管有没有人在看,烹饪都在进行。一旦你开始加热煎蛋的锅,你就可以开始煎培根了。培根烤好后,你可以把面包放进烤面包机。 对于并行算法,您需要多个cook(或线程)。一个做鸡蛋,一个做培根,等等。每个人都只专注于一项任务。每次烹饪(或线程)都将同步阻塞,等待培根准备翻转,或吐司爆裂。
(强调我的)
异步编程概念
是的,同步的意思是同时,从字面上看,它的意思是一起做功。世界上的多个人/物体可以同时做多件事,但如果我们看看计算机,它说同步意味着进程一起工作,意味着进程依赖于另一个的返回,这就是为什么它们以适当的顺序一个接一个地执行。异步意味着进程不能一起工作,它们可以同时工作(如果在多线程上),但是独立工作。
推荐文章
- 如何使HTTP请求在PHP和不等待响应
- 反应-显示加载屏幕,而DOM是渲染?
- 如何正确地读取异步/等待文件?
- 使用Moq模拟单元测试的异步方法
- 如何使用JUnit来测试异步进程
- Kotlin协程中的启动/连接和异步/等待之间有什么区别
- 如何告诉PowerShell等待每个命令结束后才开始下一个?
- CompletableFuture, Future和RxJava的Observable之间的区别
- 为什么要在c#中使用Task<T>而不是ValueTask<T> ?
- Asyncio。Gather vs asyncio.wait
- 同步调用异步方法
- 所有异步forEach回调完成后的回调
- 并发、并行和异步方法之间的区别是什么?
- 同步调用一个异步Javascript函数
- 异步等待在linq选择