アクター:読み取りモストのデータを効率的に処理する方法
質問
単一のフィールドを持っている俳優がいるとします。俳優への100のメッセージごとに99が値を読み、100番目は値を更新します。この場合、読み取りを並行して処理したいと思います。言い換えれば、俳優を使用して読み取り/書き込みロックのパフォーマンスを達成するにはどうすればよいですか?これは、Scala-Standardの俳優やAkkaで実用的ですか?または私は俳優のポイントを逃していますか:)
アップデート: 混乱した言語を修正しました、ごめんなさい
解決
免責事項:私はAkkaのPOです
代わりにエージェントを使用することをお勧めしますが、読み取りはいつでも実行できますが、一度に1つだけ書くことができます。
http://doc.akkasource.org/agents-scala
編集: http://doc.akka.io/docs/akka/2.1.0/scala/agents.html (このリンクを試してください)
他のヒント
あなたはおそらく俳優のポイントを見逃している可能性があります。私はあなたがあなたがクエリを送る俳優が欲しいと思っています、そしてそれはそれが応答を送り返します。俳優にメッセージを送信し、それを処理し、応答を送り返すことには、かなりの量の機械が必要です。応答メッセージの実際の生成は、タスクとして作成され、スレッドプールに送信されます。メッセージキューとスレッドプールの間には、ロックまたはせいぜいCAS操作が必要な複数の場所があります。通常、ポイントは、俳優がそのメッセージに基づいて別のスレッドでいくつかの作業を行うことです。
データを読み取ってめったに書きたい場合(カウンターの増加やマップ内の値へのアクセスなど)、java.util.concurrentの適切なクラスを使用する方がはるかに良いでしょう。
私は、すべてのメッセージが不変であり、ほとんどすべてのメッセージがアクターの状態を変異させないことを意味すると思います。この場合、俳優はおそらくデザインの最良の選択ではありません。アクターを使用すると、単一のスレッドコードを扱っているかのように、可変状態を管理できます。
事実上、各アクターにはメッセージが送信され、その後一度に処理されるメールボックスがあります。あなたのシナリオでは、これは非常に無駄です。提案されているように、java.util.concurrentから何かを使用することが最も効果的です。
俳優は、メッセージを連続的に処理するように設計されています。これにより、推論が簡単になります。一度に1つのメッセージを受け取るので、俳優の変数は(他の人に変異していない限り)並行性について考えずに変更できます。これは最も効率的な方法ですか?絶対違う!だが 正しく機能するやや非効率的なコード ほとんど常により良いです 壊れている非常に効率的なコード.
あなたが求めているのは正反対です。あなたは、加工速度を得るために、並行性について明示的に考えたいと考えています(「アクセスの99%が読み取り、したがって並行して発生する可能性があることはわかっています!」)。この場合、おそらく使用したいと思うでしょう java.util.concurrent.locks.ReentrantReadWriteLock
可変変数へのアクセスを直接制御するには(でアクセスのタイプがで見つかった場合 java.util.concurrent.atomic._
あなたのために働きません)。あなたが今、ロックを正しくするための負担を引き受けたことを覚えておいてください、そして適切に注意してください。