val f: Future[Result] =
for {
x <- ask(actorA, Request).mapTo[Int] // call pattern directly
s <- (actorB ask Request).mapTo[String] // call by implicit conversion
d <- (actorC ? Request).mapTo[Double] // call by symbolic name
} yield Result(x, s, d)
我想知道for-comprehension中的3个未来是否同时运行。这是从AKKA doc中提取的片段。我的猜测是,当它们被翻译成嵌套的平面地图/地图时,它们是连续的。谢谢!
答案 0 :(得分:7)
这些期货不同时运行,它们一个接一个地连续运行。
这种理解首先执行ask(actorA, Request).mapTo[Int]
。直到这个未来
完成后,for-comprehension中的下一个生成器不会被执行。
只有在ask(actorA, Request).mapTo[Int]
完成后,才会执行for-comprehension的下一行(actorB ask Request).mapTo[String]
。
一旦未来完成,就会评估for-comprehension中的第三个表达式,并开始第三个未来。
要让这些期货同时运行,你必须首先开始所有三个期货,并且只能在之后用于理解:
val fut1 = ask(actorA, Request).mapTo[Int]
val fut2 = (actorB ask Request).mapTo[String]
val fut3 = (actorB ask Request).mapTo[String]
for {
x <- fut1
s <- fut2
d <- fut3
} yield Result(x, s, d)