簡體   English   中英

Scala中序列中的多個期貨

[英]Multiple Futures in a Sequence in Scala

我在Future中有兩個計算,如下所示:

val comp1 = Future { ... }
val comp2 = Future { ... }

我想要這樣運行comp2總是在comp1完成后運行! 我知道使用for表達式,我可以將這兩個Future組合起來。

for {
  comp1Result <- comp1
  comp2Result <- comp2
} yield { ... }

什么可以保證comp1在comp2之前完成? 我的意思是這些是在不同的線程中發生的計算,並且不能保證可以運行它的順序。 有沒有辦法保證訂單不受阻塞?

用於理解的Scala是針對“容器類型”(在本例中為Futures)的flatMap和map調用的組合的語法糖,因此上面的代碼等同於:

comp1.flatMap{ comp1Result => comp2 }

此處花括號內的計算僅在comp1完成后才會發生並返回成功結果(在失敗的情況下,內部計算不會被執行)。

如果你在問題之外定義comp2之外的comp2,那么你就開始計算(你只是忽略了結果,直到你進入for comprehension),但是如果你只在for comprehension中定義它,那么除非並且直到comp1成功完成,否則它不會被啟動。 因此,請嘗試按如下方式重新編寫代碼:

val comp1 = Future { ... } // or you could put this construction inside the for as well
for {
  comp1Result <- comp1
  comp2Result <- Future { ... } // Only start the computation here
  comp3Result <- Future { ... } // etc. for as many such computations as you need
} yield { ... }

其他替代方法是將comp2聲明為惰性val(因此它實際上沒有被計算 - 開始計算 - 直到它被引用),或者作為lambda(例如val comp2 = () => Future { ... } )並用線路調用它

  comp2Result <- comp2()

在理解中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM