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 completedmessaggio:

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

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top