异步执行和同步执行之间的区别是什么?
当前回答
简单地说,异步执行是在后台做一些事情。
例如,如果你想从互联网上下载一个文件,你可以使用同步函数来做这件事,但它会阻塞你的线程,直到文件下载完成。这可能使您的应用程序对任何用户输入都没有响应。
相反,您可以使用异步方法在后台下载文件。在这种情况下,下载函数立即返回,程序继续正常执行。所有的下载操作都是在后台完成的,当你的程序完成时会收到通知。
其他回答
当执行a>b>c>d>这样的序列时,如果我们在执行过程中遇到如下失败:
a
b
c
fail
然后我们从头开始:
a
b
c
d
这是同步的
然而,如果我们有相同的序列要执行:a>b>c>d>,我们在中间有一个失败:
a
b
c
fail
...但我们不是从头开始,而是从失败的地方重新开始:
c
d
...这就是所谓的异步。
当您同步执行某项任务时,您需要等待该任务完成后才能继续执行另一项任务。当您异步执行某个任务时,您可以在它完成之前转移到另一个任务。
在操作系统上下文中,这对应于在“线程”上执行进程或任务。线程是作为工作单元存在的一系列命令(代码块)。操作系统在处理器核心上运行给定的线程。然而,处理器内核一次只能执行一个线程。它没有同时运行多个线程的概念。操作系统可以通过运行每个线程一小段时间(比如1ms),并在线程之间不断切换,来提供同时运行多个线程的假象。
现在,如果您在混合中引入多个处理器核心,那么线程可以同时执行。操作系统可以将时间分配给第一个处理器核心上的一个线程,然后将相同的时间块分配给不同处理器核心上的另一个线程。所有这些都是关于允许操作系统管理任务的完成,而您可以继续在代码中执行其他事情。
异步编程是一个复杂的主题,因为当您可以同时进行这些事情时,它们是如何结合在一起的语义。关于这个主题的文章和书籍数不胜数;看看吧!
类比简单解释
(故事和图片帮助你记住)。
同步执行
我老板是个大忙人。他让我写代码。我告诉他:好吧。我一开始,他就像秃鹰一样盯着我,站在我身后,躲在我肩上。我说:“伙计,你干嘛不去做点什么,我把这个做完?”
他会说:“不,我就在这儿等你做完。”这是同步的。
异步执行
老板让我去做这件事,而不是在那里等我的工作,老板离开去做其他的事情。当我完成我的工作时,我简单地向我的老板报告并说:“我完成了!”这就是异步执行。
(听我的建议:永远不要在老板背后工作。)
我认为一个很好的方法是把它看作是一个经典的跑步接力赛
同步:流程就像同一个团队的成员一样,它们直到收到接力棒(前一个流程/运行者执行的结束)才会执行,但它们彼此都是同步的。
异步:在同一接力赛跑道上的不同团队的成员,他们将运行和停止,彼此异步,但在同一场比赛中(整体程序执行)。
这有意义吗?
同步与异步
同步和异步操作是关于下一个任务相对于当前任务的执行顺序。
让我们看一个例子,Task 2是当前任务,Task 3是下一个任务。Task是堆栈(方法帧)中的原子操作方法调用。
同步
意味着任务将逐个执行。当前任务完成后才会启动下一个任务。任务2完成后才启动任务3。
单线程+同步-顺序
通常执行。
伪代码:
main() {
task1()
task2()
task3()
}
多线程+同步-并行
屏蔽。
阻塞意味着线程只是在等待(尽管它可以做一些有用的事情)。例如:Java ExecutorService[About] and Future[About])伪代码:
main() {
task1()
Future future = ExecutorService.submit(task2())
future.get() //<- blocked operation
task3()
}
异步
暗示任务立即返回控制,并承诺执行代码,稍后通知结果(例如。回调功能)。即使任务2没有完成,任务3也会执行。异步回调,完成处理程序
单线程+异步-并发
使用回调队列(消息队列)和事件循环(运行循环,循环器)。事件循环检查线程堆栈是否为空,如果为真,则将第一个项目从回调队列推入线程堆栈,并再次重复这些步骤。简单的例子是按钮点击,发布事件…
伪代码:
main() {
task1()
ThreadMain.handler.post(task2());
task3()
}
多线程+异步-并发和并行
非阻塞。
例如,当你需要在不阻塞的情况下在另一个线程上进行一些计算。伪代码:
main() {
task1()
new Thread(task2()).start();
//or
Future future = ExecutorService.submit(task2())
task3()
}
你可以使用阻塞方法get()或通过循环使用异步回调来使用Task 2的结果。
例如,在移动世界中,我们有UI/主线程,我们需要下载一些东西,我们有几个选择:
同步块-阻塞UI线程并等待下载完成。UI没有响应。 异步回调-创建一个新的线程,使用异步回调来更新UI(不可能从非UI线程访问UI)。回调地狱。 async coroutine[关于]-带有同步语法的异步任务。它允许将下载任务(挂起功能)与UI任务混合。
[iOS同步/异步],[Android同步/异步]
[并行vs并行]
推荐文章
- 什么时候我应该在ASP中使用异步控制器。净MVC吗?
- 理解设置
- 如何使HTTP请求在PHP和不等待响应
- 反应-显示加载屏幕,而DOM是渲染?
- 如何正确地读取异步/等待文件?
- 使用Moq模拟单元测试的异步方法
- 如何使用JUnit来测试异步进程
- Kotlin协程中的启动/连接和异步/等待之间有什么区别
- 如何告诉PowerShell等待每个命令结束后才开始下一个?
- CompletableFuture, Future和RxJava的Observable之间的区别
- 为什么要在c#中使用Task<T>而不是ValueTask<T> ?
- Asyncio。Gather vs asyncio.wait
- 同步调用异步方法
- 所有异步forEach回调完成后的回调
- 并发、并行和异步方法之间的区别是什么?