如何在 Scala 中完成后立即消费一份期货清单
How to consume a list of futures as soon as one completes in Scala
我有一堆 Futures 可以在完全不同的时间完成,像这样:
val results = task.getAssignedFiles map {
file: File => Future[Result] {
<heavy computation>
}
}
现在我想在其中一个输入 future 完成后立即迭代 results
,基本上轮询结果中的所有 futures 直到一个完成,做一些处理,然后继续直到所有这些都完成。类似于:
while (!results.allCompleted) {
one = results.firstCompletedFuture
process(one)
}
您正在寻找 firstCompletedOf。
无需 "loop" 完成期货列表即可在它们完成时对其采取行动。方法是链
使用组合器所需的计算序列并等待它们全部终止。
上面的代码可以写成:
val results:List[Future[Result] = task.getAssignedFiles map {
file: File => Future[Result] {
<heavy computation>
}
}
val processedResults:List[Future[ProcessedResult]] = results.map(result => process(result))
val finalResults:Future[List[ProcessedResult]] = Future.sequence(processedResults)
请注意,所有期货从定义之时起就是 运行。 sequence
将在最后一个完成时完成。
我有一堆 Futures 可以在完全不同的时间完成,像这样:
val results = task.getAssignedFiles map {
file: File => Future[Result] {
<heavy computation>
}
}
现在我想在其中一个输入 future 完成后立即迭代 results
,基本上轮询结果中的所有 futures 直到一个完成,做一些处理,然后继续直到所有这些都完成。类似于:
while (!results.allCompleted) {
one = results.firstCompletedFuture
process(one)
}
您正在寻找 firstCompletedOf。
无需 "loop" 完成期货列表即可在它们完成时对其采取行动。方法是链 使用组合器所需的计算序列并等待它们全部终止。
上面的代码可以写成:
val results:List[Future[Result] = task.getAssignedFiles map {
file: File => Future[Result] {
<heavy computation>
}
}
val processedResults:List[Future[ProcessedResult]] = results.map(result => process(result))
val finalResults:Future[List[ProcessedResult]] = Future.sequence(processedResults)
请注意,所有期货从定义之时起就是 运行。 sequence
将在最后一个完成时完成。