我有一堆期货可以在极其不同的时间完成,如下所示:
results
现在我想在其中一个输入期货完成时迭代while (!results.allCompleted) {
one = results.firstCompletedFuture
process(one)
}
,基本上轮询结果中的所有期货,直到一个完成,做一些处理,并继续直到所有这些完成。类似的东西:
pvg
答案 0 :(得分:1)
您正在寻找firstCompletedOf。
答案 1 :(得分:1)
没有必要在Futures列表上“循环”以在完成时对它们采取行动。方法是链 使用组合器进行所需的计算序列并等待它们全部终止。
就上述代码而言,可以写成:
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
将在最后一次完成时完成。