Je veux mettre en œuvre des modèles de communication avancés avec akka 2.1. Cependant, akka semble différer des acteurs de Scala dans un aspect clé. Là où les acteurs de scala me permettent d'appeler activement "recevoir" et fournir une fonction partielle, les acteurs d'akka adoptent le principe hollywoodien "ne nous appelle pas, nous vous appellerons" et ne définissons qu'une fonction de réception de manière statique.Acteur AKKA autonome appelant recevoir activement
Dans les acteurs de scala, je pourrais avoir un motif comme celui-ci:
class MyActor extends Actor{
override def act(){
val x = expensiveFunc()
friend ! x
val y = receive {
case Answer(a) => println(a)
}
}
}
Ici, je fais explicitement les appels à recevoir. La raison en est que j'ai besoin d'acteurs autonomes qui exécutent chacun un programme SPMD et communiquent à des points spécifiques de l'exécution. Est-il possible d'émuler ce modèle en utilisant AKKA de manière significative?
EDIT je suppose qu'il est juste de donner un aperçu complet sur mon problème.
J'ai besoin de créer un programme SPMD en utilisant des acteurs. Cela signifie que je dois être en mesure de définir un comportement pour les acteurs qui est pas seulement réactif, c'est-à-dire que je dois être en mesure d'implémenter act() comme dans les anciens acteurs de la scala. En outre, je dois appeler explicitement recevoir (p: PartialFunction [T, U]) comme je pouvais le faire dans les anciens acteurs de la scala. Si je peux faire les deux choses ci-dessus, je serai en mesure de porter mon programme SPMD des anciens acteurs vers les acteurs Akka. Je soupçonne cependant qu'il n'est pas possible de mettre en œuvre une méthode d'acte en raison du motif hollywoodien (http://en.wikipedia.org/wiki/Hollywood_principle) que AKKA semble adopter.
EDIT2 Je crois que le problème pourrait recevoir actif être résolu par devenir/quelque chose comme-devenu ceci:
import context._
def receive(p:PartialFunction[Any,Unit]){
become(p)
receive()
unbecome()
}
Cependant, cela exige que les appels imbriqués pour recevoir sont autorisés. Il y a une chance que je puisse imiter l'acte méthode en envoyant simplement un message comme:
case class Act(b:()=> Unit) extends Serializable
qui encapsule alors le comportement que je voudrais que mon acteur à effectuer.
Peut-être la meilleure façon de le faire est d'utiliser [Future] (http://doc.akka.io/docs/akka /2.1.0/scala/futures.html) – twillouer
Chaque acteur est dynamique, c'est-à-dire que l'ami est un acteur spécifique! – Felix
donc, je vais utiliser demander ce modèle [Ask] (http://doc.akka.io/docs/akka/snapshot/scala/actors.html): ami? x vous donnera un avenir et vous pouvez faire Await.result par exemple pour obtenir des résultats, ou comme futurs succès {println (a)} – twillouer