コメントで述べたように、標準アクターライブラリのCombinatiors.loop
は、アクターの本体が繰り返し実行されるときに、スタックオーバーフローからあなたを救うためのものです。イベントドリブンの再帰アクタで、StackOverflowエラーを得ることは可能ですか?
しかし、メッセージ処理が実際には常に専用スレッドプールで実行されるようにスケジュールされている場合は、イベントドリブンアクター()にloop
を使用するのは意味がありますか?体の単純な再帰呼び出しは、より効率的なオプションのようです。
次のように(Combinatiors.loop
によって呼び出される)方法Reactor.seq
が定義される:
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となり、俳優は中断されます。スタックオーバーフローの余地はありません...
どこが間違っていますか?