一个演员完成其工作后终止所有其他演员

时间:2015-09-12 04:04:37

标签: scala akka actor

我对scala和akka很新。我想知道一旦演员完成其工作,就会终止所有其他演员。

代码的基本结构如下。有一个Master负责5名工人,由RoundRobinPool生成。每个工人都在做一些工作,并将结果发回给师父。我需要意识到的是,一旦其中一个工人完成工作并将其发回给主人,让主人终止所有其他工人。然后,主机将向主函数发送一些相对值,然后整个程序终止。

知道如何实现这个吗?

//Code:    
object X{
    sealed trait Message 
    case class Result() extends Message 
    case class Work() extends Message
    case class Result() extends Message 
    case class Totalresult() extends Message
    class Worker extends Actor{
        def receive={
           case Work =>
           sender ! Result}
    }//End of class Worker         
    class Master(nrOfWorkers: Int) extends Actor{
        val workerRouter =context.actorOf(RoundRobinPool(nrOfWorkers).props(Props[Worker]))) 
        def receive={
            case Calculate => calculateSender=sender                   
            case Result => calculateSender ! Totoalresult()
        }
    }//End of class Master  
    def main(args: String) {
       val system =ActorSystem("mysystem")
       val master=system.actorOf(Props(new Master(5),name="master")  
       val future=master ? Calculate
    }  
}

1 个答案:

答案 0 :(得分:0)

Akka的主要监督方面之一是,某个演员被视为对其子女负责。在这种情况下,这意味着“大师”演员的死亡将自动导致其所有孩子的终止,所以你真正需要做的就是让“大师”演员自行终止。这可以通过多种方式完成,例如通过KillPoisonPill消息发送给自己 - 例如,在发送self ! PoisonPill后直接添加行TotalResult消息回到calculateSender

请注意,在您在代码中描述的特定方案中,您设置为在main中接收结果的未来,但不包括任何处理(例如onComplete调用或使用Await)结果。在这样的处理过程中,您可以包含对system.shutdown()的调用,而不是让“Master”终止自身,然后在关闭过程中终止所有actor - 只需确保在将来之后调用它(因而背后的演员努力)已经完成。

PS:有关终止演员的不同方式之间的差异的更多信息,请参阅this question