一旦一个演员完成工作,就终止所有其他演员

Terminates all other actors once one actor finishes its work

我对 scala 和 akka 还很陌生。我想知道一旦其中一个演员完成工作就终止所有其他演员。

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

知道如何实现吗?

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

Akka 的主要监督方面之一是指定的参与者被认为对其 children 负责。在这种情况下,这意味着 "Master" actor 的死亡将自动导致其所有 children 终止,因此您真正需要做的就是让 "Master" actor 自行终止。这可以通过多种方式完成,例如通过 KillPoisonPill 消息自身 - 例如,在发送 TotalResult 后直接添加行:self ! PoisonPill回信给 calculateSender.

请注意,在您在代码中描述的特定场景中,您设置为在主程序中接收结果的未来,但不包括任何处理(例如 onComplete 调用,或使用该结果的 Await)。在这样的处理中,您可以调用 system.shutdown() 而不是让 "Master" 自行终止,这将终止所有参与者作为关闭过程的一部分 - 请确保仅在之后调用它未来(以及它背后的演员努力)已经完成。

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