[英]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 */
}
最初的futureA
和futureB
for comprehensive
futureB
之前,它們將並行運行。
Future(A).zipWith(Future(B))((_,_) => C)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.