2016-11-25 13 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