如何使用scala / akka运行预定的递归?

时间:2016-07-01 16:30:43

标签: scala recursion out-of-memory akka

如何在没有java.lang.OutOfMemoryError的情况下运行这样的东西:无法创建新的本机线程?

def doSomething(): Unit = {
    akka.actor
        .ActorSystem(System)
        .scheduler
        .scheduleOnce(1 seconds)(doSomething()) 
}

3 个答案:

答案 0 :(得分:2)

我猜你经常打电话给doSomething

Akka' ActorSystem是一个相对资源密集型的对象。它通常意味着在你的程序的整个生命周期。在引擎盖下,ActorSystem管理Thread中的少数ThreadPool个,所有演员都在其中运行。 ThreadPool保持活着,直到你告诉它关闭。

如果您经常致电doSomething,那么您每次都会创建新的ActorSystem,因此会创建一个新的8个左右的主题。最终JVM无法再创建线程,这将导致您的OOM错误。

解决方案是让您的ActorSystem实例可用并且#34;全局",并确保在您的程序完成后将其关闭。

object MyGlobals {
  val actorSystem = ActorSystem()
}

def doSomething() = {
  MyGlobals.actorSystem.scheduler.scheduleOnce(...)
}

// and then at the end of your program
actorSystem.terminate()

答案 1 :(得分:1)

使用schedule方法而不是scheduleOnce方法,而是相应地传递参数。要查看示例,请访问下面的链接。 有关更多信息,请访问:http://doc.akka.io/docs/akka/current/scala/scheduler.html

答案 2 :(得分:1)

如果您只想每1秒执行一次功能,可以这样:

def doSomething(): Unit = ???

akka.actor.ActorSystem()
  .scheduler
  .schedule(initialDelay = 0 seconds, interval = 1 second)(doSomething())