2010-02-23 16 views
4

Appelez le !! méthode d'un acteur à un autre acteur travailleur semble garder le canal ouvert même après que la réponse a été reçue par l'appelant (à savoir: le futur est prêt).Scala 2.8Beta1 Acteur

Par exemple, en utilisant !! pour envoyer 11 messages différents d'un acteur à un autre acteur de travail, 11 messages similaires à ceux ci-dessous seront affichés dans la boîte aux lettres de l'appelant original, chacun avec une valeur Channel @ xxxx différente.

! (Scala.actors.Channel @ 11b456f, sortie (com.test.app.actor.QueryActor @ 4f7bc2, «normal))

-ce que ces messages en attente de réponses du travailleur, comme l'appelant d'origine est envoyer un message de sortie sur son propre appel à exit(), ou sont-ils générés à l'autre extrémité, et pour une raison quelconque ont le formulaire imprimé ci-dessus? À ce stade, l'acteur travailleur a déjà quitté, donc l'appelant d'origine !! ne recevra certainement aucune réponse.

Ce comportement est indésirable, car la boîte aux lettres de l'acteur appelant d'origine se remplit de ces messages de sortie (un pour chaque canal créé à chaque fois !! a été utilisé).

Comment cela peut-il être arrêté? L'appelant original est-il automatiquement "lié" aux canaux de réponse créés sur chaque !! appel?

Répondre

5

La raison pour laquelle ces messages de sortie sont envoyés à l'appelant d'origine est que l'appelant relie son canal temporaire, qui est utilisé pour recevoir le résultat futur, à l'appelé. En particulier, si le canal reçoit un signal de sortie, un message de sortie est envoyé sur ce canal, ce qui entraîne un message similaire à ce que vous décrivez à envoyer à l'appelant réel (vous pouvez considérer les canaux comme des balises sur les messages). Ceci est fait pour autoriser (relancer) une exception à l'intérieur de l'appelant si l'appelé se termine avant de servir le futur message envoyé (l'exception est levée lors de l'accès au futur).

Le problème avec l'implémentation actuelle est que l'appelant reçoit un message de sortie même si le futur était déjà résolu. C'est clairement un bug qui devrait être classé sur le Scala Trac. Une solution possible consiste à envoyer uniquement un message de sortie si le futur n'a pas encore été résolu. Dans ce cas, le message de sortie sera supprimé chaque fois que l'on accède au futur pour la première fois en utilisant apply ou isSet.

+1

On dirait que lorsque le futur est créé, il est lié à l'acteur qui va fournir la valeur. Lorsque la valeur est définie, je pense qu'elle doit être dissociée. Cela empêcherait tous ces messages. En outre, l'accumulation dans la liste des liens est essentiellement une fuite de mémoire. –

+1

Scala billet a été faite par M. Engbrecht https://lampsvn.epfl.ch/trac/scala/ticket/3102 –

+0

@scaling_out Philipp a maintenant fermé le cocher. Il devrait être disponible sur le prochain tronçon de Scala tous les soirs, ou sur la prochaine bêta de Scala. –