我创建了Master actor和child actors(使用
我想要解决的问题是当child actors完成任务时如何正确地通知Master?
在一些教程(例如Pi approximation和Scala In Action书中的示例),Master actor在接收到子actor的响应后会比较任务的初始数组大小和接收到的结果大小。
router
从Master创建)。Master接收一些Job并将其拆分成小任务,然后将它们发送给子actor(routees)。我想要解决的问题是当child actors完成任务时如何正确地通知Master?
在一些教程(例如Pi approximation和Scala In Action书中的示例),Master actor在接收到子actor的响应后会比较任务的初始数组大小和接收到的结果大小。
if(receivedResultsFromChildren.size == initialTasks.size) {
// it's mean children finished their job
}
但我认为这很糟糕,因为如果某个儿童演员抛出异常,那么它将不会将结果发送回发送方(回到Master),所以此条件永远不会评估为true
。
那么如何正确地通知主人所有孩子完成了他们的工作呢?
我认为其中一个选项是向孩子们广播PoisonPill
,然后监听Terminated(
router)
消息(使用所谓的deathWatch
)。这是一个好的解决方案吗?
如果使用Broadcast(PoisonPill)
更好,那么我是否应该注册一些监督策略,在发生异常的情况下停止某些路由器?因为如果发生异常,那么路由器将被重启,我知道这意味着Master actor将永远不会收到Terminated(
router)
。这是正确的吗?