2017-05-12 10 views
0

私はデータを読み込んでデータベースを作成するcsvファイルを持っています。私はこれを行うためにスカラを使用しています。 dbインサートを並行して実行するのではなく、インサートを順番に(つまり、順番に)実行したいと考えています。 forループでAwaitを使用するつもりはありません。待っている以外の方法はありますか?スカラ:ファイルデータのシーケンシャル処理

PS:私は、CSVファイルからリストに1000個のエントリを読んで、DBを作成するには、リスト上でループすると、あなたのデータベースのsave(entity: T): Future[_]方法のいくつかの種類を持っていると仮定すると

+0

あなたが開始されない場合、なぜあなたは挿入文をループで一つ一つを実行していないデータベースに挿入する非同期メソッドを持っていますか – ovunccetin

答えて

1

を挿入している、あなただけのflatMapであなたの未来を折ることができます(または理解のため):

def saveAll(entities: List[T]): Future[Unit] 
    entities.foldLeft(Future.successful(())){ 
    case (f, entity) => for { 
     _ <- f 
     _ <- save(entity) 
     } yield() 
    } 
    } 
0

もう一つのオプションは再帰関数です。 foldLeftより簡潔ではありますが、一部ではより読みやすくなります。ちょうどあなたの検討のためのもう一つの選択肢は(save(entity: T): Future[R]を前提としています。あなたのsaveメソッドが許可されている場合

def saveAll(entities: List[T]): Future[List[R]] = { 
    entities.headOption match { 
    case Some(entity) => 
     for { 
     head <- save(entity) 
     tail <- saveAll(entities.tail) 
     } yield { 
     head :: tail 
     } 
    case None => 
     Future.successful(Nil) 
    } 
} 

さらに別のオプションは、あなたがあなた自身のExecutionContextすなわちsave(entity: T)(implicit ec: ExecutionContext): Future[R]、ちょうど同時にFuture秒を発射された供給が、シングルスレッド実行コンテキストを使用します:??

def saveAll(entities: List[T]): Future[List[R]] = { 
    implicit ec = ExecutionContext.fromExecutionService(java.util.concurrent.Executors.newSingleThreadExecutor) 
    Future.sequence(entities.map(save)) 
} 
+0

シングルスレッド・エグゼキュータをシャットダウンする必要があります。そのようなスレッドを作成することはお勧めしませんが、代わりに発信者からのECが必要です。 –

関連する問題