我是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'个actor。 这些actor由Main对象创建并启动。 Main应该只向上面创建的一个actor发送消息。 从Main接收消息的actor应该将相同的消息转发给另一个ALREADY创建/启动的actor。
这可能吗?如果是这样,你能指导我正确的方向吗?
提前致谢, MS
答案 0 :(得分:5)
首先,我建议查看Akka演员,很快将取代Scala 2.10中的Scala演员,希望在接下来的几个月里出演。
话虽如此,绝对有可能,工作流程会像这样(至少在Akka):
ActorSystem
方法中创建main
。Actor
方法在ActorSystem
内根据需要生成actorOf
,这将返回ActorRef
个对象。ActorRef
来发送消息。在Actor
实现中,以某种方式让Actor
知道其他人(可能通过构造函数),并弄清楚你希望如何在整个系统中传播String
(在这个注释,我通常更喜欢使用Scala案例类作为消息)。
这种听起来就像一个类似于系统的状态机 - 我一直在玩的一个想法是将ActorSystem
视为图形实体,这意味着每个{{1}实例你传递了它的邻居列表(可能是Actor
)。
您还可以查看最近推出的Akka团队的新Vector[ActorRef]
s DSL。
要了解有关Akka的更多信息,我建议使用以下资源:
答案 1 :(得分:0)
我找到了一种通过使用actor数组在scala中执行上述问题的方法。 由于所有参与者都将执行相同的操作(即)转发消息,因此创建MyActor的多个实例就足够了。 非常感谢!