2012-09-29 2 views
1

Je suis nouveau sur scala et j'essaye d'écrire un programme en scala qui crée plusieurs acteurs (disons 30) et passe des messages entre eux.Créer plusieurs acteurs dans scala

Voici ce que j'ai réussi jusqu'à présent:

import scala.actors.Actor 
import scala.util.Random 

    class MyActor(val id:Int, val N:Int) extends Actor { 
     def act() { 
      println ("Starting actor: " + id)  

      /** 
       react{ 

         case str : String => 
           println("Received Msg: " + str) 

           val randNo : Int = Random.nextInt(N) 
           println("Actor " + id + " Picking a random actor: " + randNo) 

      // Here, I should forward the message received to the ALREADY created and started actors  
          // val objActor = new MyActor(randNo : Int, N : Int) 
          // objActor.start 
          // objActor ! str 
         } 
      */ 
     } 
    } 

    object Main { 

    def main(args:Array[String]) { 

     if(args.length == 0) 
     { 
      println("Usage scala Main <numNodes>") 
      sys.exit() 
     } 

     val N : Int = (args(0)).toInt 

     // Starting all actors 

     for (i: Int <- 0 to N-1) { 
       val a = new MyActor(i : Int, N : Int) 
       println ("About to start actor " + a.id) 
       a.start 
     // a!"Broadcast this msg to all actors" 
     } 
     } 
    } 

L'objectif du programme est de créer plusieurs acteurs et transmettre une chaîne d'un acteur à l'autre.

Le code ci-dessus crée le nombre «N» d'acteurs donné comme argument de ligne de commande. Ces acteurs sont créés et démarrés par l'objet Principal. Main devrait envoyer un message à SEULEMENT UN des acteurs créés ci-dessus. L'acteur qui reçoit le message du Main doit transmettre le même message à un autre acteur déjà créé/démarré.

Est-ce possible? Si oui, pouvez-vous me guider dans la bonne direction?

Merci à l'avance, MS

Répondre

5

Tout d'abord, je vous suggère de vérifier les acteurs AKKA bientôt remplacer les acteurs Scala de Scala 2.10 qui est à venir, espérons dans les prochains mois.

Cela dit, il est certainement possible, le flux de travail irait quelque chose comme ça (au moins en Akka):

  1. Créer un ActorSystem dans votre méthode main.
  2. Générer Actor comme souhaité dans le ActorSystem via la méthode actorOf, qui renverra un objet ActorRef.
  3. Choisissez l'un de ces ActorRef pour envoyer le message à.

Dans la mise en œuvre Actor, en quelque sorte faire le Actor au courant des autres (peut-être par le constructeur), et figure sur la façon dont vous voulez la propager la String dans tout le système (sur cette note, je préfère en général en utilisant le cas Scala classes comme messages). Ce genre de sons ressemble à un système de machine d'état - une idée de mon esprit avec laquelle j'ai joué est de traiter le ActorSystem comme une entité graphique, ce qui signifie que pour chaque instance Actor vous lui passez une liste de ses voisins (peut-être comme Vector[ActorRef]).

Vous pouvez également consulter le nouveau Actor s DSL récemment introduit par l'équipe Akka.

Pour en apprendre davantage sur Akka, je recommande les ressources:

  1. Jonas Bonér's recent talk at NY Scala introducing Akka
  2. Akka in Action (MEAP)
0

je trouve un moyen de faire le problème indiqué ci-dessus dans scala lui-même en utilisant un tableau d'acteurs. étant donné que tous les acteurs vont effectuer la même opération (c'est-à-dire,) transmettre le message, il suffit de créer plusieurs instances de MyActor. Merci beaucoup!

Questions connexes