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?
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?
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)
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)
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
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