2014-07-02 49 views
5
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) 

我想知道理解中的3期是否同時運行。這是從AKKA doc中提取的片段。我的猜測是,它們是順序的,因爲它們被翻譯成嵌套的平面地圖/地圖。謝謝!理解中的期貨的執行順序(順序或併發)是什麼?

回答

7

這些期貨並不同時運行,它們依次連續運行。

這個理解首先執行ask(actorA, Request).mapTo[Int]。在此未來 完成之前,未執行for-comprehension中的下一個生成器。

只有在ask(actorA, Request).mapTo[Int]完成後,纔會執行理解的下一行(actorB ask Request).mapTo[String]

一旦這個未來完成,第三個表達的理解被評估,第三個未來開始。

要具備這些期貨同時運行,你就必須先啓動所有三個期貨,只有在以後的換理解使用它們:

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)