这个kotlin协程代码是如何工作的?



我有两个挂起函数

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())
}

但是当我尝试使用下面的函数时,我在~6秒后得到结果。为什么会这样?

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

数字加号操作符要求在计算右边运算符之前先执行左边运算符。这意味着,包括async在内的右侧操作将被延迟,直到语句中左侧的操作被完全求值(这包括左侧的await,这需要整整3秒)。

以表达式 为例
someBooleanResponse(a, b, c) || someOtherBooleanExpression(d, e)

在这个表达式中,左侧的someBooleanResponse将在右侧开始之前被充分评估。这是(ab)有时在脚本中使用,使其成为一个条件。

对于您的示例也是如此。右手边一直保持到左手边完成。例如,如果左侧抛出异常,则永远不需要右侧。

要解决这个问题,需要在调用await之前执行两个async语句。否则,第二个async甚至不会启动,因此您将再等待3秒。

最新更新