2016-11-25 14 views
0

完成我有一堆期货,可以在非常不同的时间完成的,像这样:如何尽快消耗期货的列表为一体,在斯卡拉

val results = task.getAssignedFiles map { 
    file: File => Future[Result] { 
    <heavy computation> 
    } 
} 

现在我想在results迭代为一旦投入期货的一个完成,基本调查结果中的所有期货,直到完成,做一些处理,并继续,直到完成所有期货。例如:

while (!results.allCompleted) { 
    one = results.firstCompletedFuture 
    process(one) 
} 
+0

更好地看看ReactiveStreams impl如Akka Streams – cchantep

+0

你是说我应该将我的期货作为输入转换成Akka流?我对此没有太多的经验,所以任何指针都会有用 – UtsavShah

+0

完成每个未来会发生什么? – maasg

回答

1

您正在寻找firstCompletedOf

+0

如果我正确地理解了这个问题,OP想要处理来自未来计算的每个结果,而不仅仅是第一个。也许@UtsavShah可以澄清。 – maasg

+0

您可以稍后通过编写'firstCompleteOf'的结果顺序列表来完成此操作。 – Reactormonk

1

没有必要在期货清单上“循环”以便在完成后对其采取操作。该方法是使用组合器连锁 所需的计算序列,并等待它们全部终止。

在上面的代码方面可以写成:所有期货自定义它们的时刻运行

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将在最后完成的时刻完成。

+0

未来一旦完成,我想确保剩下的工作由同一个线程完成,因为从属工作将写入一个大文件。但这些期货的订单顺序并不重要。所以我不想像这样链接它。 – UtsavShah

+0

@UtsavShah写作可以在未来的情况下完成,使用适当的锁定。最终的结果将是相同的,而逻辑将更容易编写。 – maasg