分配太多内存时,Scala Future不会返回任何内容

时间:2014-04-14 10:12:43

标签: scala concurrent.futures

使用Scala-IDE 3.0.3(基于Scala 2.10.4),通过显示未来计算List的前10个值以及Future completed,可以正确完成以下代码消息:

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

但是,将范围List.range(1, 50)更改为List.range(1, 5000)不会显示任何内容(Failure未触发)。从逻辑上讲,它似乎与内存问题有关,但我不了解那里发生的事情。

更奇怪的是,在REPL中运行此代码不会导致问题。我在那里错过了什么?

1 个答案:

答案 0 :(得分:3)

事实证明,整个问题不是Futures中的内存管理问题,而是与Eclipse处理并发程序的控制台输出的方式有关。

在程序结束时添加Thread.sleep(1000)让Eclipse显示所有控制台输出,解决问题。

非常感谢@jilen的非常有用的评论!