先物はここで実行し始めている:
val fFuture: Future[Int] = Future { println("f called"); 3 }
val gFuture: Future[Int] = Future { println("g called"); 4 }
だから、両方の実行を並行して開始されています。しかし、誤ってFuture{...}
を内包の中に入れた場合、それらは順番に実行されます。
基本的には、2つの結果を1つのFutureにサブスクライブしてマージします。しかし、あなたのケースでは、2番目の未来の結果が無視されたように思えますが、これは意味がありません。
for {
f <- fFuture
g <- gFuture
} yield f + g
このコードは、Future[Int]
(例のコードと同じです)を返します。この未来から価値を引き出すなら、あなたは3 + 4 = 7
になります。しかし、まだ彼らはシーケンシャルは依然として高いです作るあなたの計算は独立し、(前述の)開発者のミスの確率があるよう最善のアプローチではないですが、独立した計算のためにとてもお勧めのアプローチは、次のとおりです。
(fFuture zip gFuture) map {
case (f, g) => f + g
}
このコードはで参照透明ですそれはまだ(prallelで実行されようとしてFuture
-they'reの場合には、それは他の並行処理プリミティブのために異なる場合があります)同じように動作します
をfor-comprehension
実際に理にかなってどこに - あなたはFuture{...}
でfFuture
を交換する場合でも、ということを意味?ここで:g
として
for {
f <- Future{... 9}
g <- if (f > 0) Future{...} else Future{...}
} yield g
がここf
に依存 - そうfor
は、熱心に評価されているいくつかのFuture
の
「未来」は 'for'の内部では実行されません。宣言されると(常に)実行され、 'for'を使用して構成されます。 – cchantep
@cchantep技術的には、ExecutionContextが実行を決定したときにのみ実行されます。 –
私は言っておくべきことは、宣言と、将来の宣言との間に宣言があるので、ECによって決定された一度に実行されるべきだったはずです。お互いに – cchantep