期貨開始在這裏執行:
val fFuture: Future[Int] = Future { println("f called"); 3 }
val gFuture: Future[Int] = Future { println("g called"); 4 }
因此,無論執行並行開始。但是,如果您不小心將Future{...}
置於理解範圍內,它們將按順序執行。
For-comprehension基本上訂閱併合併成一個未來的兩個結果。然而,就你而言,似乎第二個未來的結果被忽略了,這是沒有道理的。代碼有意義:
for {
f <- fFuture
g <- gFuture
} yield f + g
此代碼返回Future[Int]
(與您的示例中的代碼相同)。如果你從這個未來提取價值 - 你得到3 + 4 = 7
。但是它仍然不是你的計算是獨立開發者的錯誤(如上所述)的可能性,這使得它們的順序仍然是高一個最好的方法,進行獨立計算,因此推薦的做法是:
(fFuture zip gFuture) map {
case (f, g) => f + g
}
此代碼是在引用透明這意味着即使你與Future{...}
替換fFuture
- 它仍然表現相同(在Future
-they're將在prallel執行,但情況下,它可能是其他併發原語不同)
會在哪裏for-comprehension
實際意義?在這裏:
for {
f <- Future{... 9}
g <- if (f > 0) Future{...} else Future{...}
} yield g
由於g
取決於f
這裏 - 有沒有辦法來運行這些並行,所以for
提供作曲幾個Future
小號
「未來」並未在'for'內執行。它們在聲明(總是)時執行,並使用'for'組成。 – cchantep
@cchantep從技術上講,只有當ExecutionContext決定執行它們時纔會執行它們。 –
正如我應該說的那樣,由歐盟決定一次執行,因爲它們的聲明很可能(在那裏很重要)在聲明和'for'之前,沒有可預測的順序,因爲這些'Future'不依賴於彼此。 – cchantep