アクターモデルは、可変状態を外界から分離するために使用できます。可変状態(たとえば、複数の並行プロセスに割り当てられたIDのグローバルレジストリ)がある場合、その可変状態をアクター内にラップし、クライアントにメッセージパッシングを介してアクターと通信させることができます。そうすれば、アクターだけが可変状態に直接アクセスし、あなたが言うように、クライアントメッセージは1つずつ読み取られて処理されるようにキューに入れられます。メッセージが不変であることが重要です。
キューがいっぱいになるのを防ぐために、メッセージ処理(、、など)をできるだけ短くすることが重要react
ですreceive
。実行時間の長いタスクは、他のアクターに渡す必要があります。
1. Actor A receives a message M from sender S
2. A spawns a new actor C
3. A sends (S, f(M)) to C
4. In parallel:
4a. A starts processing the next message.
4b. C does the long-running or dangerous (IO) task,
When finished, sends the result to S,
and C terminates.
プロセスのいくつかの選択肢:
- C
(S, result)
はSに転送するAに送り返します
- Aはマッピングを保持する
ActorRef C => (Sender S, Message M)
ため、Cが失敗した場合は、新しいアクターでMの処理を再試行できます。
要約すると、アクターは、複数のクライアントがさまざまなスレッドから複数のメッセージを送信できる範囲でマルチスレッド化されており、アクターがこれらすべてのメッセージを連続して処理することが保証されています(ただし、順序付けは、過度ではないさまざまな対象になる可能性があります)厳格な制約)。
アクターのreact
コードはさまざまなスレッドで実行される可能性がありますが、単一の特定の時点では、単一の特定のスレッドでのみ実行されることに注意してください(スケジューラーが適切と考えるように、アクターがスレッドからスレッドにジャンプすることを想像できますが、これは技術的な詳細です)。注:アクターはメッセージの処理間のセマンティクスの前に発生することを保証するため、内部状態は同期化を必要としません。
並列処理は、複数のアクターを並列に動作させ、通常はスーパーバイザー階層を形成するか、ワークロードのバランスをとることによって実現されます。
必要なのが並行/非同期計算だけであるが、グローバル状態を持っていないか、取り除くことができない場合は、Future
sの方が構成が簡単で概念が簡単であることに注意してください。