2012-09-29 125 views
1

我是scala的新手,我正在嘗試在scala中編寫一個程序,它創建了多個(比如說30個)actor,並在它們之間傳遞消息。在scala中創建多個參與者

下面是我已經成功至今:

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" 
     } 
     } 
    } 

該計劃的目標是創建多個角色,並從一個演員轉發到另一個字符串。

上面的代碼創建'N'個參數作爲命令行參數。 這些actor由對象Main創建並啓動。 主要應該只發送一條消息給以上創建的演員之一。 從Main接收消息的actor應該將相同的消息轉發給另一個ALREADY創建/啓動的actor。

這可能嗎?如果是這樣,你能指導我正確的方向嗎?

由於提前, MS

回答

5

首先,我建議檢查出阿卡演員,很快就取代斯卡拉演員在斯卡拉2.10的希望出來,在未來數個月。

話雖這麼說,這是絕對有可能,工作流會(至少在阿卡)去是這樣的:

  1. main方法創建一個ActorSystem
  2. 產卵Actor根據需要在ActorSystem通過actorOf方法,這將返回一個ActorRef對象。
  3. 選擇其中一個ActorRef's發送消息給。

Actor實施,在某種程度上使Actor知道別人(可能通過構造函數),並找出你想怎麼傳播String整個系統(在這張票據上,我一般喜歡使用Scala的情況下,類作爲消息)。

這種聽起來像一個像系統的狀態機 - 我一直在玩的一個想法是將ActorSystem當作一個圖實體,這意味着每個Actor實例都將它傳遞給一個列表它的鄰居(也許作爲Vector[ActorRef])。

您還可以查看最新推出的Akka團隊新推出的Actor s DSL

學習更多有關阿卡,我推薦的資源:

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

我找到了一種方法,通過使用做斯卡拉自身上述問題一系列演員。因爲所有參與者都要執行相同的操作(即,)轉發消息,所以創建MyActor的多個實例就足夠了。 非常感謝!