2017-06-20 4 views
1

このコードの目的は、一連の先物を受け取り、Future.sequenceで処理し、別の一連の先物を生成し、別のFuture.sequenceで再度処理することです。2つのFuture.sequenceのシーケンスが機能しない

問題は何も印刷されないということです。このコードで何が問題になっていますか?

object TestFutures extends App { 

    def future (i:Int) = Future { i } 
    def future2 (i:Int) = Future { i * 20 } 

    val futureResult = (1 to 10).map { 
    x => future(x) 
    } 

    var futureInts = Seq[Future[Int]]() 

    Future.sequence(futureResult).map{ list => 
    list.foreach(y => futureInts = futureInts :+ future2(y)) 
    } 

    Future.sequence(futureInts).map { list2 => 
    list2.foreach(z => println(z)) 
    } 


    Thread.sleep(5000) 
} 

答えて

1

これは機能しますが、Thread.sleepと先物処理の実行の間に競合状態があります。あなたがAwait.resultと先物の完了を待つことができます。

import scala.concurrent.{Await, Future} 
import scala.concurrent.ExecutionContext.Implicits._ 
import scala.concurrent.duration._ 

def future(i: Int) = Future.successful(i) 
def future2(i: Int) = Future.successful(i * 20) 

val futureResult = (1 to 10).map(x => future(x)) 

val firstResult = 
    Future 
    .sequence(futureResult) 
    .flatMap(list => Future.sequence(list.map(future2)) 

val sequence = Await.result(firstResult, 10 seconds) 

sequence.foreach(println) 

注あなたは同期生産コードで先物にブロックしてはならない、これは将来のあなたはそれがやりたいんデモンストレーションのためだけにあります。

+0

なぜflatMapを使用していますか? – ps0604

+0

@ ps0604 'sequence'(flatMap内部の内部配列)を使うと' Future [Future [Seq [Int]] 'が生成され、余分なレイヤーを削除したいのです。 –

関連する問題