2011-05-06 11 views
4

コメントで述べたように、標準アクターライブラリの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となり、俳優は中断されます。スタックオーバーフローの余地はありません...

どこが間違っていますか?

答えて

0

loopは汎用構造であり、スレッドベースおよびイベント駆動の両方のアクターに使用できます。スレッドベースのアクターのメッセージを再帰的に処理しようとすると、(メッセージ処理が末尾に再帰的で最適化できる場合を除いて)スタックオーバーフローが発生してすぐに終了します。

スレッドベースのアクターに固有のスタックオーバーフローシナリオがイベントドリブンのアクターには有効でない限り、再帰的な処理がより効果的です。イベントドリブンアクターについては有効です。再帰を最適化できるようにする)。

関連する問題