2012-09-29 123 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的多个实例就足够了。 非常感谢!