期货内部的执行顺序(顺序或并发)是什么?

use*_*078 5 scala future akka

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)
Run Code Online (Sandbox Code Playgroud)

我想知道for-comprehension中的3个未来是否同时运行.这是从AKKA doc中提取的片段.我的猜测是,当它们被翻译成嵌套的平面地图/地图时,它们是连续的.谢谢!

axe*_*l22 7

这些期货不同时运行,它们一个接一个地连续运行.

这种理解首先执行ask(actorA, Request).mapTo[Int].在此未来完成之前,for-comprehension中的下一个生成器不会被执行.

只有在ask(actorA, Request).mapTo[Int]完成之后(actorB ask Request).mapTo[String],才执行for-comprehension的下一行.

一旦这个未来完成,就会评估for-comprehension中的第三个表达,并开始第三个未来.

为了让这些期货同时运行,你必须首先开始所有三个期货,并且只在之后的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)
Run Code Online (Sandbox Code Playgroud)