一旦一个演员完成工作,就终止所有其他演员
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 自行终止。这可以通过多种方式完成,例如通过 Kill
或 PoisonPill
消息自身 - 例如,在发送 TotalResult
后直接添加行:self ! PoisonPill
回信给 calculateSender
.
请注意,在您在代码中描述的特定场景中,您设置为在主程序中接收结果的未来,但不包括任何处理(例如 onComplete
调用,或使用该结果的 Await
)。在这样的处理中,您可以调用 system.shutdown()
而不是让 "Master" 自行终止,这将终止所有参与者作为关闭过程的一部分 - 请确保仅在之后调用它未来(以及它背后的演员努力)已经完成。
PS:有关终止 actor 的不同方式之间差异的更多信息,请参阅 this question。
我对 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 自行终止。这可以通过多种方式完成,例如通过 Kill
或 PoisonPill
消息自身 - 例如,在发送 TotalResult
后直接添加行:self ! PoisonPill
回信给 calculateSender
.
请注意,在您在代码中描述的特定场景中,您设置为在主程序中接收结果的未来,但不包括任何处理(例如 onComplete
调用,或使用该结果的 Await
)。在这样的处理中,您可以调用 system.shutdown()
而不是让 "Master" 自行终止,这将终止所有参与者作为关闭过程的一部分 - 请确保仅在之后调用它未来(以及它背后的演员努力)已经完成。
PS:有关终止 actor 的不同方式之间差异的更多信息,请参阅 this question。