我是相对较新的Scala演员。我有一个巨大的地图,它被分成更小的块并通过演员执行。根据地图大小,创建的演员数量会有所不同。演员运作良好,过程完成。但是如何检查生成的actor的状态?在java中,我熟悉线程池执行器服务的使用。在Scala中如何做到这一点?
答案 0 :(得分:4)
有多种方法可以做你想做的事:
让工作人员向发件人发送一条消息,告知其操作已完成。每个actor都有一个对发送方actor(发送消息的actor)的引用,您可以使用它来发送完成消息。然后发件人可以处理该邮件。
使用tell
,而不是通过actor ! msg
发送消息(例如ask
),而Future
将返回DeathWatch
。您可以在完成后运行的Future上设置回调。
如果为一次性操作启动了worker actor,请在操作完成后通过停止它来终止它自己。父actor(创建worker actor的那个)可以通过case class PerformWork(i: Int)
case object WorkDone
class ParentActor(size: Int) extends Actor {
for (i <- 1 to size) {
val actor = context.actorOf(Props[Worker], s"worker$i")
actor ! PerformWork(i)
}
var result = 0
def receive = {
case WorkDone => {
result += 1
if (result == size) {
// work is done
}
}
}
}
class Worker extends Actor {
def receive = {
case m: PerformWork => {
// do some work
// ...
sender ! WorkDone
}
}
}
机制监视工作者,该机制在子actor终止时通知父项。在这种方法中,终止意味着操作已经完成。但是,您需要跟踪父级接收的终止次数,以确定所有工作人员何时完成。
使用哪种方法取决于您的使用案例和操作的性质。最常见和最灵活的方法是#1。示例(未测试):
{{1}}