为何两段Kotlin协程async代码执行耗时分别为3秒和6秒?
为什么两段协程代码耗时差异这么大?
先看你定义的两个挂起函数:
suspend fun doSomethingUsefulOne(): Int { delay(3000L) return 20 } suspend fun doSomethingUsefulTwo(): Int { delay(3000L) return 10 }
第一段代码(耗时3秒):并行执行
runBlocking { val a = async { doSomethingUsefulOne() } val b = async { doSomethingUsefulTwo() } println(a.await() + b.await()) }
这段代码里,async被调用时就立刻启动了对应的协程:
- 执行
val a = async { ... },doSomethingUsefulOne开始运行,进入3秒延迟 - 紧接着执行
val b = async { ... },doSomethingUsefulTwo也同步启动,进入3秒延迟 - 两个协程并行执行,3秒后同时完成,
await()只是获取已计算好的结果,所以总耗时约3秒。
第二段代码(耗时6秒):串行执行
runBlocking { println(async { doSomethingUsefulOne() }.await() + async { doSomethingUsefulTwo() }.await()) }
这段代码的执行逻辑完全不同:
- 先执行
async { doSomethingUsefulOne() }.await():async启动协程后,await()会挂起当前runBlocking的协程,必须等doSomethingUsefulOne的3秒延迟结束、返回结果后才会继续往下走 - 第一个
await()拿到结果后,才会执行第二个async { doSomethingUsefulTwo() }.await(),此时第二个协程才启动,再走3秒延迟 - 两个协程是串行执行的,3+3=6秒,所以总耗时约6秒。
总结
async本身是立即启动协程的,但如果把async和await()写在同一条语句里,await()会阻塞后续代码执行,导致第二个协程只能等第一个完成后才启动,从而变成串行执行。要实现并行,必须先启动所有需要并行的async任务,再统一调用await()等待结果。
内容的提问来源于stack exchange,提问作者newbie_coder
相关产品推荐
相关产品推荐

