簡體   English   中英

您如何在Scala中撰寫依賴期貨,以使除一個期貨外的所有期貨並行運行?

[英]How can you compose dependent futures in Scala so that all but one run in parallel?

例如,您可以執行以下操作:

Future(/* A */).flatMap(_ => Future(/* B */).flatMap(_ => Future(/* C */)))

在這里B依賴於A來完成,是否有一種干凈的方法來構成期貨,以便C依賴於A和B來完成並且A和B可以並行運行?

我認為您正在尋找的是Future.sequence方法,該方法可以將Future的序列簡化為單個Future 這是一個簡單的示例:

def createFuture(name: String, sleep: Int): Future[(String, Int)] = {
  Future({
    println(s"Starting $name with sleep $sleep")
    Thread.sleep(sleep)
    println(s"After $name")
    (name, sleep)
  })
}

val rnd = new Random()
val fa = createFuture("A", rnd.nextInt(1000) + 500)
val fb = createFuture("B", rnd.nextInt(1000) + 500)
val ff = Future.sequence(List(fa, fb)).flatMap(l => createFuture("C" + l.map(_._2).sum, 100))
Await.result(ff, Duration.Inf)

運行之一的輸出是:

從睡眠開始B 1287
從睡眠開始A 550
之后
B之后
從睡眠100開始C1837
C1837之后

如果您還想“快速失敗”,可以考慮如何等待多個期貨中的更復雜答案。

for yield是執行此操作的干凈方法,它等於flatMap ,例如:

val futureA = Future {
  // do something
}
val futureB = Future {
  // do something
}
for {
_ <- futureA
_ <- futureB
} yield Future {
  /* C */
}

最初的futureAfutureB for comprehensive futureB之前,它們將並行運行。

Future(A).zipWith(Future(B))((_,_) => C)

暫無
暫無

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

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