1

我是 scala 的新手,我正在尝试在 scala 中编写一个程序,该程序创建多个(例如 30 个)actor 并在它们之间传递消息。

以下是我到目前为止所管理的:

 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”个作为命令行参数给出的演员。这些actors由对象Main创建和启动。Main 应仅向上述创建的参与者之一发送消息。从 Main 接收消息的 Actor 应该将相同的消息转发给另一个已经创建/启动的 Actor。

这可能吗?如果是这样,你能指导我正确的方向吗?

提前致谢,女士

4

2 回答 2

5

首先,我建议查看 Akka 演员,很快将在 Scala 2.10 中取代 Scala 演员,希望在未来几个月内推出。

话虽如此,这绝对是可能的,工作流程会是这样的(至少在 Akka 中):

  1. ActorSystem在您的main方法中创建一个。
  2. Actor在 via 方法中根据需要生成,ActorSystemactorOf将返回一个ActorRef对象。
  3. 选择其中一个ActorRef来发送消息。

Actor实现中,以某种方式Actor了解其他人(可能通过构造函数),并弄清楚您希望如何在String整个系统中传播(在此说明中,我通常更喜欢使用 Scala 案例类作为消息)。

这种听起来像一个类似状态机的系统——我一直在玩的一个想法是把它ActorSystem当作一个图形实体,这意味着对于每个Actor实例,你传递它的邻居列表(也许是一Vector[ActorRef])。

您还可以查看Akka 团队最近推出的新Actors DSL 。

要了解有关 Akka 的更多信息,我推荐以下资源:

  1. Jonas Bonér 最近在 NY Scala 的演讲介绍了 Akka
  2. Akka 在行动(MEAP)
于 2012-09-29T07:43:23.507 回答
0

我找到了一种方法,通过使用一组演员在 scala 本身中解决上述问题。由于所有参与者都将执行相同的操作(即)转发消息,因此创建多个 MyActor 实例就足够了。非常感谢!

于 2012-09-29T18:41:09.890 回答