是否有可能在事件驱动的递归actor中出现StackOverflow错误?

时间:2011-05-06 12:50:15

标签: scala actor

正如在评论中所说的那样,标准actor库的Combinatiors.loop旨在让你在重复执行actor的主体时避免堆栈溢出。

但是,对于事件驱动的actor(loop)使用react是否有意义,实际上,事实上,[几乎]总是安排在专用的情况下执行消息处理线程池?身体的简单递归调用似乎是一种更有效的选择。


方法Reactor.seq(由Combinatiors.loop调用)定义如下:

  private[actors] def seq[a, b](first: => a, next: => b): Unit = {
    val killNext = this.kill
    this.kill = () => {
      this.kill = killNext

      // to avoid stack overflow:
      // instead of directly executing `next`,
      // schedule as continuation
      scheduleActor({ case _ => next }, null)
      throw Actor.suspendException
    }
first
throw new KillActorControl

}

我们假设,直接调用next。在这种情况下,react立即执行,message handling is scheduled,并且演员被暂停。没有堆栈溢出的空间......

我哪里错了?

1 个答案:

答案 0 :(得分:0)

loop是一个通用构造,可用于基于线程的事件和事件驱动的actor。如果你试图以递归方式处理基于线程的actor的消息,你将很快得到堆栈溢出(除非你的消息处理是尾递归的,并且可以进行优化)。

关于事件驱动的actor,你是绝对正确的 - 递归处理会更有效,只要特定于基于线程的actor的堆栈溢出场景对于事件驱动的actor无效(你甚至不应该使递归可以优化)。