Scala Future non restituisce nulla quando alloca troppa memoria
-
26-12-2019 - |
Domanda
Utilizzando Scala-IDE 3.0.3 (basato su Scala 2.10.4), il seguente codice viene completato correttamente visualizzando i primi 10 valori del valore calcolato List
da un futuro così come il Future completed
messaggio:
import scala.concurrent._
import scala.concurrent.duration._
import scala.util.{Failure, Success}
import ExecutionContext.Implicits.global
object FutureNonBlocking extends App {
val f1: Future[List[Int]] = future {
val t = List.range(1, 50).filter(_ % 2 == 0)
println("Done")
t
}
f1.onComplete {
case Success(value) => println(value.take(10))
case Failure(e) => println("Something bad happened")
}
Await.complete(f1, 30 seconds)
}
Tuttavia, cambiando l'intervallo List.range(1, 50)
per List.range(1, 5000)
non mostra nulla e (il Failure
non è attivato).Logicamente, sembra essere correlato a un problema di memoria, ma non capisco cosa stia succedendo lì.
Ancora più strano, l'esecuzione di questo codice in un REPL non causa il problema.Cosa mi manca lì?
Soluzione
Si scopre che il tutto non è un problema con la gestione della memoria in Futures
ma è correlato al modo in cui Eclipse gestisce l'output della console per i programmi concorrenti.
Aggiungere Thread.sleep(1000)
alla fine del programma lascia che Eclipse mostri tutto l'output della console, risolvendo il problema.
Grazie mille @jilen per il tuo commento molto utile!