gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:45:32 24 4
gpt4 key购买 nike

正如评论中所说, Combinatiors.loop 当 Actor 的主体被重复执行时,标准 Actor 库旨在避免堆栈溢出。

但是,使用 loop 是否有意义?对于事件驱动的参与者( react ),实际上何时消息处理 [几乎] 总是安排在专用线程池中执行? body 的简单递归调用似乎是一个更有效的选择。

方法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 ,并且 Actor 被暂停。没有堆栈溢出的空间...

我哪里错了?

最佳答案

loop是一种通用构造,可用于基于线程和事件驱动的actor。如果您尝试递归处理基于线程的 actor 的消息,您将很快以堆栈溢出结束(除非您的消息处理是尾递归的,并且可以优化)。

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

关于scala - 事件驱动的递归actor是否有可能出现 StackOverflow 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5911704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com