설명에서 언급했듯이 표준 액터 라이브러리 Combinatiors.loop
은 액터 본문이 반복적으로 실행될 때 스택 오버플로를 방지하기위한 것입니다.이벤트 구동 재귀 액터로 StackOverflow 오류를 얻을 수 있습니까?
그러나 이벤트 처리 액터 (react
)에 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
직접 호출은 다음과 같습니다 (Combinatiors.loop
에 의해 호출)
방법 Reactor.seq
정의된다. 이 경우 즉시 react
이 실행되고 message handling is scheduled, 액터가 일시 중단됩니다. 스택 오버플로를위한 공간이 없습니다 ...
어디에서 잘못 되었나요?