期货开始在这里执行:
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