48

私はいくつかのObjective-C/iOS開発を行っており、アクターパターンへのいくつかの言及を聞いています。Big Nerd Ranchの本には、次のように書かれています。

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

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

4

1 に答える 1

62

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

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

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

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

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

于 2012-07-26T18:38:10.253 に答える