Kotlin协程中async与await不同写法耗时存在差异的原因是什么
Kotlin协程async/await耗时差异原因解析
核心结论
耗时差异和async的返回值行为无关,本质是await()的调用时机不同,导致协程分别以并行、串行模式执行。
Kotlin协程中async默认使用CoroutineStart.DEFAULT启动模式,只要调用async方法,协程就会立即启动执行内部逻辑,不需要等待await()调用。
第一段代码(耗时约1000ms)执行流程
- 先调用
async启动第一个协程,立即执行内部delay(1000)逻辑 - 无需等待第一个协程执行完成,立刻调用第二个
async启动第二个协程,同步执行内部delay(1000)逻辑 - 两个协程并行运行,1000ms后几乎同时执行完成
- 后续调用
a.await()、b.await()仅用于获取已完成协程的返回结果,无额外等待耗时 - 总耗时等于单个协程的执行时长1000ms
第二段代码(耗时约2000ms)执行流程
- 调用第一个
async启动协程后,立刻调用await(),此时当前协程会挂起阻塞,直到第一个协程的delay(1000)执行完成、拿到返回值赋值给a后才会继续向下执行 - 第一个协程执行完毕后,才会调用第二个
async启动协程,再次调用await()挂起等待1000ms - 两个协程完全串行执行,总耗时等于两个协程执行时长之和2000ms
疑问解答
你猜测的「async返回Deferred和执行后直接返回值的行为不同」不成立,两段代码中async的执行逻辑完全一致,差异仅在于await的调用时机:是先启动所有需要并行的任务再统一等待结果,还是每启动一个任务就立刻等待它执行完成。
内容的提问来源于stack exchange,提问作者최상용
相关产品推荐
相关产品推荐

