由于这个概念类似于C#中的async&await
,所以也许我能提供一些见解。在C#中,一个可以使用await
等待的Task
应该是“热”的,即已经在运行。我假设在Scala中也是一样的,从函数返回的Future
不需要显式地启动,只是在调用后自动“运行”。 如果不是这种情况,则以下纯属(可能不真实的)猜测。
让我们分析第一种情况:
async {
await(slowCalcFuture) + await(slowCalcFuture)
}
我们到达那个代码块并执行第一个await:
async {
await(slowCalcFuture) + await(slowCalcFuture)
^^^^^
}
好的,所以我们正在异步等待这个计算完成。当它完成时,我们会“继续”分析这个区块:
async {
await(slowCalcFuture) + await(slowCalcFuture)
^^^^^
}
第二个await,所以我们正在异步等待第二个计算完成。在完成后,我们可以通过添加两个整数来计算最终结果。
如您所见,我们正在逐步移动await,按顺序等待Future一个接一个地到来。
让我们看一下第二个例子:
async {
val future1 = slowCalcFuture
val future2 = slowCalcFuture
await(future1) + await(future2)
}
好的,这里是(可能)发生的事情:
async {
val future1 = slowCalcFuture // >> first future is started, but not awaited
val future2 = slowCalcFuture // >> second future is started, but not awaited
await(future1) + await(future2)
^^^^^
}
我们正在等待第一个Future
,但是两个Futures目前都在运行。当第一个返回时,第二个可能已经完成(因此我们将立即获得结果),或者我们可能需要再等待一段时间。
现在很明显,第二个示例在并行运行两个计算,然后等待它们都完成。当两个都准备好时,它就会返回。第一个示例以非阻塞的方式顺序运行计算。