正如在评论中所说的那样,标准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,并且演员被暂停。没有堆栈溢出的空间......
我哪里错了?
答案 0 :(得分:0)
loop
是一个通用构造,可用于基于线程的事件和事件驱动的actor。如果你试图以递归方式处理基于线程的actor的消息,你将很快得到堆栈溢出(除非你的消息处理是尾递归的,并且可以进行优化)。
关于事件驱动的actor,你是绝对正确的 - 递归处理会更有效,只要特定于基于线程的actor的堆栈溢出场景对于事件驱动的actor无效(你甚至不应该使递归可以优化)。