Devo eseguire più future in parallelo e il programma non dovrebbe bloccarsi o bloccarsi.Eseguire più futures in parallelo, restituire il valore predefinito sul timeout
Per ora aspetto i futures uno per uno e utilizzo il valore di fallback se c'è TimeoutException.
val future1 = // start future1
val future2 = // start future2
val future3 = // start future3
// <- at this point all 3 futures are running
// waits for maximum of timeout1 seconds
val res1 = toFallback(future1, timeout1, Map[String, Int]())
// .. timeout2 seconds
val res2 = toFallback(future2, timeout2, List[Int]())
// ... timeout3 seconds
val res3 = toFallback(future3, timeout3, Map[String, BigInt]())
def toFallback[T](f: Future[T], to: Int, default: T) = {
Try(Await.result(f, to seconds))
.recover { case to: TimeoutException => default }
}
Come posso vedere, il tempo massimo di attesa di questo frammento è timeout1 + timeout2 + timeout3
La mia domanda è: come posso aspettare tutte quelle future in una sola volta, in modo da poter ridurre il tempo di attesa per max(timeout1, timeout2, timeout3)
?
EDIT: Alla fine ho usato modifica @Jatin e @senia risposte:
private def composeWaitingFuture[T](fut: Future[T],
timeout: Int, default: T) =
future { Await.result(fut, timeout seconds) } recover {
case e: Exception => default
}
e in seguito viene utilizzato come segue:
// starts futures immediately and waits for maximum of timeoutX seconds
val res1 = composeWaitingFuture(future1, timeout1, Map[String, Int]())
val res2 = composeWaitingFuture(future2, timeout2, List[Int]())
val res3 = composeWaitingFuture(future3, timeout3, Map[String, BigInt]())
// takes the maximum of max(timeout1, timeout2, timeout3) to complete
val combinedFuture =
for {
r1 <- res1
r2 <- res2
r3 <- res3
} yield (r1, r2, r3)
e poi io uso combinedFuture
come vedo in forma .
Quello che non capisco è, come è 'timeout1 + timeout2 + timeout3'? È piuttosto 'timeout1' per future1', timeout2 per future2 e così via. Le domande non mi sono ancora chiare – Jatin
Vuole eseguire le 3 attività in parallelo, in modo tale che il timeout sia il massimo del timeout delle tre attività –
Penso che questa risposta che ho dato tempo fa sia simile a quello che vuoi e anche sfrutta i callback non bloccanti. http://stackoverflow.com/questions/16304471/scala-futures-built-in-timeout/16305056#16305056 – cmbaxter