アクターが軽量である理由は何ですか?
それらがどのように機能するかさえわかりません。それらは別のスレッドではありませんか?
軽量とは、各アクターが単一のスレッドにマップされていないことを意味します。
JVMは、同時実行抽象化の主要な形式として、ロック付きの共有メモリスレッドを提供します。ただし、共有メモリスレッドは非常に重いため、コンテキスト切り替えのオーバーヘッドによってパフォーマンスが大幅に低下します。JVMスレッドを使用した1対1のマッピングに基づくアクターの実装の場合、Scalaアクターごとのプロセスペイロードは、特定の計算のためにアクターの100万のインスタンスを生成できるほど軽量ではありません。したがって、Scalaアクターは軽量のイベントオブジェクトとして設計されており、基になるワーカースレッドプールでスケジュールされて実行され、長時間実行される操作ですべてのスレッドがブロックされると自動的にサイズが変更されます。実際、Scalaは、スレッドベースとイベントベースのアクターの統一モデルを実装しています。Scalaアクターは、フルスタックフレームサスペンション(受信として実装)と継続クロージャーに基づくサスペンション(反応として実装)の2つの形式のサスペンションメカニズムを提供します。イベントベースのアクターの場合、反応の待機は継続クロージャ、つまりアクターの残りの計算をキャプチャするクロージャによって表されます。中断されたアクターが、アクターで指定されたパターンの1つに一致するメッセージを受信すると、基になるスレッドプールからワーカースレッドの1つにタスクをスケジュールすることによって継続が実行されます。The ■計算。中断されたアクターが、アクターで指定されたパターンの1つに一致するメッセージを受信すると、基になるスレッドプールからワーカースレッドの1つにタスクをスケジュールすることによって継続が実行されます。The ■計算。中断されたアクターが、アクターで指定されたパターンの1つに一致するメッセージを受信すると、基になるスレッドプールからワーカースレッドの1つにタスクをスケジュールすることによって継続が実行されます。The HallerとOderskyによる論文「スレッドとイベントを統合するアクター」では、実装の詳細について説明しています。