You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两段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被调用时就立刻启动了对应的协程:

  1. 执行val a = async { ... },doSomethingUsefulOne开始运行,进入3秒延迟
  2. 紧接着执行val b = async { ... },doSomethingUsefulTwo也同步启动,进入3秒延迟
  3. 两个协程并行执行,3秒后同时完成,await()只是获取已计算好的结果,所以总耗时约3秒。

第二段代码(耗时6秒):串行执行

runBlocking {
    println(async { doSomethingUsefulOne() }.await() + async { doSomethingUsefulTwo() }.await())
}

这段代码的执行逻辑完全不同:

  1. 先执行async { doSomethingUsefulOne() }.await():async启动协程后,await()会挂起当前runBlocking的协程,必须等doSomethingUsefulOne的3秒延迟结束、返回结果后才会继续往下走
  2. 第一个await()拿到结果后,才会执行第二个async { doSomethingUsefulTwo() }.await(),此时第二个协程才启动,再走3秒延迟
  3. 两个协程是串行执行的,3+3=6秒,所以总耗时约6秒。

总结

async本身是立即启动协程的,但如果把async和await()写在同一条语句里,await()会阻塞后续代码执行,导致第二个协程只能等第一个完成后才启动,从而变成串行执行。要实现并行,必须先启动所有需要并行的async任务,再统一调用await()等待结果。

内容的提问来源于stack exchange,提问作者newbie_coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:10:31