为了便于理解,期货的执行顺序是什么(顺序的还是并发的)


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个future是否并发运行。这是从AKKA文档中摘录的一个片段。我的猜测是,当它们被转换成嵌套的平面映射/映射时,它们是顺序的。谢谢!

这些期货不是并发运行的,而是一个接一个连续运行的。

for-comprehension语句首先执行ask(actorA, Request).mapTo[Int]。直到这个未来完成后,将不执行for推导式中的下一个生成器。

只有在执行完ask(actorA, Request).mapTo[Int]后,才执行换行式的下一行(actorB ask Request).mapTo[String]

一旦该将来式完成,则计算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)

最新更新