2017-08-29 3 views
0

Ich habe Liste der Futures:Wie kann ich laufen zwei (nehmen von config) Futures gleichzeitig

val futures = List(Future(1), Future(2), Future(3), Future(4), Future(5)) 

wie kann ich laufen nur zwei (Wert nimmt von config), nicht alle parallel?

+1

A 'Future' zu ​​laufen beginnt bei der Erstellung (vorausgesetzt, es gibt eine verfügbare Thread im Laufbecken) laufen. Zu dem Zeitpunkt, zu dem Ihre "Liste" erstellt wird, sind möglicherweise einige der Futures bereits abgeschlossen. – jwvh

Antwort

4

Futures erfordern eine ExecutionContext zu laufen - im Grunde ein Thread-Pool. Wenn dieser Pool nur n Threads enthält, ist das der Grad der Parallelität, den Sie erhalten.

val pool = Executors.newFixedThreadPool(numThreads) 
implicit val ec = ExecutionContext.fromExecutorService(pool) 
0

diese Lösung gefunden, werde ich nur zwei Futures in einer Zeit

def doSome(num:Int) = Future { 
    num 
    } 

    def doSomeS(list:List[Int]): Future[List[Int]] = { 
    Future.traverse(list)(doSome) 
    } 

    def serialiseFutures[A, B](l: List[A], size:Int)(function: List[A] ⇒ Future[List[B]]) 
          (implicit ec: ExecutionContext): Future[List[B]] = 
    l.grouped(size).foldLeft(Future(List.empty[B])) { 
     (previousFuture: Future[List[B]], next: List[A]) => 
     for { 
      previousResults: List[B] <- previousFuture 
      next<- function(next) 
     } yield previousResults ++ next 
    } 

    val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9) 

    serialiseFutures(list, 2)(doSomeS) 
+0

Nr. Sie _launching_ die Futures 2 auf einmal. Nachdem sie gestartet wurden, laufen sie alle parallel (so viel wie der Ausführungskontext es zulässt), was genau das ist, was du gesagt hast, dass du es nicht willst. – jwvh

Verwandte Themen