2011-05-06 3 views
4

설명에서 언급했듯이 표준 액터 라이브러리 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, 액터가 일시 중단됩니다. 스택 오버플로를위한 공간이 없습니다 ...

어디에서 잘못 되었나요?

답변

0

loop은 스레드 기반 및 이벤트 구동 액터 모두에 사용할 수있는 범용 구조체입니다. 스레드 기반 액터의 메시지를 재귀 적으로 처리하려고하면 메시지 처리가 꼬리 재귀 적이 아니고 최적화 될 수 없다면 스택 오버플로가 빨리 끝납니다.

이벤트 기반 액터와 관련해서는 스레드 기반 액터에 특정한 스택 오버 플로우 시나리오가 이벤트 구동 형 액터에 대해 유효하지 않은 한 절대적으로 올바른 재귀 처리가 효과적입니다 (심지어 ' 재귀를 최적화 할 수 있도록).

관련 문제