web-dev-qa-db-ja.com

アクターパターン-正確に構成するもの

私はいくつかの客観的なC/iOS開発を行っており、アクターパターンへのいくつかの参照を聞いています。 Big Nerd Ranchの本では、次のように書かれています。

アクターオブジェクトは、実行時間の長いタスクと、完了後に実行する必要のあるコードがある場合に使用されます。この種類のオブジェクトには、タスクの実行に必要な情報と、タスクの完了時に実行するコールバックが与えられます。アクターはそれ以上の入力なしで独自のスレッドで実行され、終了すると破棄されます。

ここでのアクターは、ネットワークコールと組み合わせて使用​​されます。これは、アクターの主な使用方法ですか?委任に対して相互に排他的または無料ですか?アクターの定義は非常に広いようで、私はそれが何を意味するのかをより良く理解しようとしています。また、非OO環境でアクターを使用することは可能ですか?

44
timpone

アクターのその定義は、実際には少し制限されているようです。もちろん、Erlangスタイルのアクター(またはScalaスタイルのアクターを信じています)を処理しません。私の経験では、俳優は次のようなものです。

  • メッセージを送受信します(各アクターにはメールボックスがあります)
  • 他のアクターと可変メモリを共有しません
  • ランタイムの気まぐれに基づいてスケジュールされます。アクターには独自のスレッドを与えることができますが、複数のアクターが単一のスレッドで協調マルチスレッドに参加するか、またはプリエンプティブマルチスレッドに参加する可能性が高くなります。

しかし基本的に、アクターは、その環境からメッセージを受信し、その環境にメッセージを送り返すことができるフリーランニングコードの塊です。

アクターは、たくさんの(そしてたくさんの)ステートフルで小さなプロセスが必要なときにいつでも使用されます。各接続にスレッド全体を割り当てたくないため、ネットワークは一般的な使用例です。より軽量なものが必要な場合は、各接続にアクターを割り当ててから、スレッドの小さなプールでアクターをスケジュールします。しかし、アクターを使用するのはネットワークだけではありません。

アーランでは、アクターは関数です。この関数はおそらくそれ自体を末尾呼び出しします(したがって、基本的に無限ループです)。ループは通常、システムからのメッセージを待って処理し、システムの残りの部分にメッセージを送信します。 Erlang OTPライブラリには、ループを記述する必要さえないいくつかの抽象化があるため、OTPアクターはコールバックのセットとして実装されます。そのように、OTPアクターはオブジェクトによく似ています。

60