:ここScalaの従属先物をどのように構成して、1つを除くすべてが並行して実行されるようにすることができますか?あなたが行うことができる。例えば
Future(/* A */).flatMap(_ => Future(/* B */).flatMap(_ => Future(/* C */)))
B Cが完了するまでにAとBの両方に依存し、AとBがで実行できるように先物を構成するためのクリーンな方法があり、完了するまでにAに依存平行?
:ここScalaの従属先物をどのように構成して、1つを除くすべてが並行して実行されるようにすることができますか?あなたが行うことができる。例えば
Future(/* A */).flatMap(_ => Future(/* B */).flatMap(_ => Future(/* C */)))
B Cが完了するまでにAとBの両方に依存し、AとBがで実行できるように先物を構成するためのクリーンな方法があり、完了するまでにAに依存平行?
Future
のシーケンスをFuture
に減らすことができる方法は、Future.sequenceです。ここでは簡単な例です:実行のいずれかの
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)
出力は次のとおりです。
C1837の起動B
後
後スリープ550
で始まる睡眠1287
とBを起動します睡眠中100
後C1837
あなたも「高速失敗」を持っているしたい場合は、How to wait for several Futures
for yield
からより複雑な答えを考慮することができるが、これを行うにはきれいな方法であり、それは次のように、flatMap
に等しいです:
val futureA = Future {
// do something
}
val futureB = Future {
// do something
}
for {
_ <- futureA
_ <- futureB
} yield Future {
/* C */
}
初期futureA
for comprehensive
の前にfutureB
と入力すると、パラレルで実行されます。
Future(A).zipWith(Future(B))((_,_) => C)
私はAとBはしかし、並列に実行する必要があり、これは順次 – goodOldFashioned
あなたは 'for'理解でそれらを起動する場合にのみ順番に実行されます@goodOldFashionedそれらを実行します。 'futureA'と' futureB'が 'Future [_]'のようなもので '()=> Future [_]'でない場合、これは正常に動作します – Tyler