我有两个挂起函数
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秒。