2009-06-29 11 views

答えて

8

によって異なります。非アクターコードからアクターにメッセージを送信すると、ActorProxyが自動的に作成され、ローカルのスレッドに保管されます。これは、スレッドがGCされるまでActorProxyがGCされないため、非常に小さいものの、潜在的なメモリリークを引き起こします。 ActorProxyは、本質的に、非アクタースレッドが多くの点で、受信メッセージを含むアクターのように振舞うことを可能にする。

さらに大きな問題は、アクターライブラリがスレッドを管理する方法と同様に、スレッドが管理されている場合です。そのため、論理コンテキストを表現するものは、一度に1つのスレッドになり、別のスレッドになることがあります。これの良い例は、サーブレットコンテナです。論理コンテキストはサーブレットまたはセッションですが、ActorProxyはスレッドにバインドされるため、論理コンテキスト間で共有されます。あなたのアクターがActorProxyに返信していない場合、これは大きな問題ではありませんが、そうであれば、(a)応答が間違ったコンテキストによって潜在的に受け取られるか、(b)メッセージは受信されません。したがって、前述の小さな漏れは、ActorProxiesのメールボックスがいっぱいになると大きな漏れになります。

[編集] うーん...私は質問を読むことに問題があるようです!アクターブロック内で囲むことで、新しいアクターオブジェクトが作成されます。このアクターオブジェクトは、終了時に適切にGCされます。メッセージをアクターブロックに送ると、メッセージの送信は、アクターを作成するスレッドではなく、別のスレッドの新しい反応で行われることになります。

+0

偉大な答え、エリック、ありがとう。 "actor {}"ブロック(私の質問のように)で呼び出しをラップすることは同じ問題を抱えていますか?または、スレッドが存続しているかどうかにかかわらず、ブロックが終了したときに作成されたアクタGC可能ですか? –

0

私はそれを行う際に問題はありません。あなたのコードに意味があるなら、なぜそうではありませんか? 純粋な俳優のモデルを見ると、すべてが俳優であり、俳優だけが互いにコミュニケーションしています。このようなコードを設計することができれば...素晴らしい...非アクターからアクターにメッセージを送信する。

+0

私はあまりよく分かりません。結局のところ、反応では、 "送信者"は何ですか? –

+0

送信者は暗黙的に作成されたActorProxyであり、送信スレッドにバインドされています。 –

関連する問題