2017-05-23 4 views
0

:ここScalaの従属先物をどのように構成して、1つを除くすべてが並行して実行されるようにすることができますか?あなたが行うことができる。例えば

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

B Cが完了するまでにAとBの両方に依存し、AとBがで実行できるように先物を構成するためのクリーンな方法があり、完了するまでにAに依存平行?

答えて

1

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

0

for yieldからより複雑な答えを考慮することができるが、これを行うにはきれいな方法であり、それは次のように、flatMapに等しいです:

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

初期futureAfor comprehensiveの前にfutureBと入力すると、パラレルで実行されます。

+0

私はAとBはしかし、並列に実行する必要があり、これは順次 – goodOldFashioned

+1

あなたは 'for'理解でそれらを起動する場合にのみ順番に実行されます@goodOldFashionedそれらを実行します。 'futureA'と' futureB'が 'Future [_]'のようなもので '()=> Future [_]'でない場合、これは正常に動作します – Tyler

0

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

関連する問題