タイプActor
のactor_
というプロパティを持つクラスがあるとします。私に問題がありますか?俳優ではない人から俳優にメッセージを送るのは悪い習慣ですか?
def someMethod() = {
actor_ ! "HELLO"
}
または、メッセージを常に別のアクタから送信する必要があります。例えば
def someMethod() = {
Actor.actor { actor_ ! "HELLO" }
}
タイプActor
のactor_
というプロパティを持つクラスがあるとします。私に問題がありますか?俳優ではない人から俳優にメッセージを送るのは悪い習慣ですか?
def someMethod() = {
actor_ ! "HELLO"
}
または、メッセージを常に別のアクタから送信する必要があります。例えば
def someMethod() = {
Actor.actor { actor_ ! "HELLO" }
}
によって異なります。非アクターコードからアクターにメッセージを送信すると、ActorProxyが自動的に作成され、ローカルのスレッドに保管されます。これは、スレッドがGCされるまでActorProxyがGCされないため、非常に小さいものの、潜在的なメモリリークを引き起こします。 ActorProxyは、本質的に、非アクタースレッドが多くの点で、受信メッセージを含むアクターのように振舞うことを可能にする。
さらに大きな問題は、アクターライブラリがスレッドを管理する方法と同様に、スレッドが管理されている場合です。そのため、論理コンテキストを表現するものは、一度に1つのスレッドになり、別のスレッドになることがあります。これの良い例は、サーブレットコンテナです。論理コンテキストはサーブレットまたはセッションですが、ActorProxyはスレッドにバインドされるため、論理コンテキスト間で共有されます。あなたのアクターがActorProxyに返信していない場合、これは大きな問題ではありませんが、そうであれば、(a)応答が間違ったコンテキストによって潜在的に受け取られるか、(b)メッセージは受信されません。したがって、前述の小さな漏れは、ActorProxiesのメールボックスがいっぱいになると大きな漏れになります。
[編集] うーん...私は質問を読むことに問題があるようです!アクターブロック内で囲むことで、新しいアクターオブジェクトが作成されます。このアクターオブジェクトは、終了時に適切にGCされます。メッセージをアクターブロックに送ると、メッセージの送信は、アクターを作成するスレッドではなく、別のスレッドの新しい反応で行われることになります。
私はそれを行う際に問題はありません。あなたのコードに意味があるなら、なぜそうではありませんか? 純粋な俳優のモデルを見ると、すべてが俳優であり、俳優だけが互いにコミュニケーションしています。このようなコードを設計することができれば...素晴らしい...非アクターからアクターにメッセージを送信する。
私はあまりよく分かりません。結局のところ、反応では、 "送信者"は何ですか? –
送信者は暗黙的に作成されたActorProxyであり、送信スレッドにバインドされています。 –
偉大な答え、エリック、ありがとう。 "actor {}"ブロック(私の質問のように)で呼び出しをラップすることは同じ問題を抱えていますか?または、スレッドが存続しているかどうかにかかわらず、ブロックが終了したときに作成されたアクタGC可能ですか? –