簡體   English   中英

順序運行期貨

[英]Running futures sequentially

以下代碼的目的是根據條件執行Future f3f4 請注意,條件取決於Future f1f2的結果,因此必須等待。 這似乎可行,但是由於f1f2是期貨,因此此代碼不應順序運行。 此代碼正確嗎?

object TestFutures extends App {

  val f1 = Future { 1 }
  val f2 = Future { 2 }
  val f3 = Future { 3 }
  val f4 = Future { 4 }

  val y = 1

  for {
    condition <- if (y>0) f1 else f2
    _ <- if (condition==1) f3.map {a => println("333")} else f4.map {b => println("444")}
  }  yield ()


  Thread.sleep(5000)
}

不,這是不正確的。 當像您一樣創建Future時,它將立即開始計算。 到達之前for理解,所有的4個期貨已經運行。 您需要稍后根據條件創建它們。

val y = 1
for {
  condition <- if (y > 0) Future { 1 } else Future { 2 }
  _ <- if (condition == 1) 
    Future { 3 }.map(a => println("333"))
  else 
    Future { 4 }.map(b => println("444"))
} yield ()

出於可讀性考慮,最好將創建的每個方法提取到您將要調用的方法中。

很明顯,它們在創建時就開始運行,因為您可以說

Future(1).map(x => println(x))

它的工作原理沒有任何觸發。 無論如何嘗試運行以下代碼

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

def printWhenCompleted[A](f: Future[A]): Future[A] = f.map { x =>
    println(x)
    x
}

val f1 = printWhenCompleted(Future { 1 })
val f2 = printWhenCompleted(Future { 2 })
val f3 = printWhenCompleted(Future { 3 })

for {
  r3 <- f3
  r2 <- f2
  r1 <- f1
} yield r1 + r2 + r3

它應該給你這些數字中隨機順序,而不是連續的3, 2, 1

編輯

這是使用flatMap實現的第一個代碼(不帶println

val futureCondition = if (y > 0) Future(1) else Future(2)
futureCondition.flatMap(condition => if (condition == 1) Future(3) else Future(4))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM