2009-06-29 6 views

Répondre

8

Cela dépend. Lorsque vous envoyez un message à un acteur à partir d'un code non-acteur, un ActorProxy est automatiquement créé et stocké dans un thread local. Cela crée une fuite de mémoire potentielle, bien qu'une très petite, parce que le ActorProxy ne sera pas GC'd jusqu'à ce que le thread est GC'd. L'ActorProxy permet essentiellement au thread non-acteur de se comporter comme un acteur, y compris la réception de message. Le plus gros problème est de savoir si votre thread est géré, de la même manière que la bibliothèque d'acteur gère les threads, de sorte que ce qui représente un contexte logique puisse être sur un thread et être à un autre moment sur un autre thread. Un bon exemple de ceci serait un conteneur de servlet. Votre contexte logique peut être une servlet ou une session, mais ActorProxy va être lié au thread, et donc partagé entre les contextes logiques. Si vos acteurs ne répondent pas à ActorProxy, ce n'est pas un gros problème, mais s'ils le sont, cela entraînera probablement des problèmes parce que (a) les réponses seront potentiellement reçues dans le mauvais contexte, ou (b) le les messages ne sont jamais reçus, et ainsi la petite fuite mentionnée précédemment devient importante à mesure que les boîtes à lettres des ActorProxies se remplissent.

[Éditer] Hmm ... Je semble avoir un problème pour lire les questions! L'entourer dans le bloc acteur crée un nouvel objet acteur qui sera correctement GC'd quand il se termine. Gardez à l'esprit que mettre le message envoyer dans un bloc acteur signifie que le message envoyé sera fait dans une nouvelle réaction sur un autre fil, pas dans le fil créant l'acteur.

+0

Bonne réponse, Eric, merci. Est-ce que l'encapsulation de l'invocation dans un bloc "acteur {}" (comme dans ma question) souffre du même problème? Ou est-ce que l'acteur créé est GC-capable quand le bloc se termine, indépendamment du fait que le fil continue? –

0

Je ne vois aucun problème à le faire. Si cela a du sens dans votre code, alors pourquoi pas? Si vous regardez le modèle de l'acteur pur tout est un acteur et que seuls les acteurs communiquent entre eux, si vous pouvez concevoir votre code comme ça..grand..si vous ne pouvez pas ou ne voulez pas alors c'est ok envoyer des messages de non-acteurs aux acteurs.

+0

Je ne suis pas si sûr. Après tout, dans la réaction, que serait «expéditeur»? –

+0

Sender serait un ActorProxy implicitement créé qui est maintenant lié au thread expéditeur. –

Questions connexes