【发布时间】:2014-07-11 10:13:36
【问题描述】:
我正在为 Akka 编写 HelloWorld,我已经在 Main Actor 中创建了固定(20 到 50)个 Actor,其中一半是简单的计数器,另一半计算阶乘并以某种方式求和结果。 主要目标是测试 Akka 如何处理顽皮的挂起线程。我将具有半随机时间的 Thread.sleeps 添加到我的线程中,并通过安排特殊的 ForceShutdown 案例来定义超时。
我想要得到什么:
- 1) 主要参与者接收 StopMessage,从以下位置收集结果 儿童演员并给他们PoisonPill
- 2) 收集完所有结果后,主要 Actor 关闭 系统
- 3) 如果在超时期间未收集结果,则 ForceShutdown 案例正在启动,杀死一切并关闭 强制系统。
我得到了什么: 1 和 2 工作正常,但是:
- 3) 一旦 ForceShutdown 被触发,MainActor 仍在等待 孩子们完成他们的工作,这不会终止他们。
我尝试了几种 ForceShutdown 案例的变体,但大多数都一样,等待子演员完成未完成的工作。 这是一个例子:
case ForceShutdown =>
println(s"[${self.path.name}] ForceShutdown received!")
children foreach { child => system.stop(child) }
system shutdown
那么,如何在 Akka 中强制终止挂起的演员?
【问题讨论】:
-
在actor模型中,你不会终止某人,而是请某人停下来。这就是您的代码不起作用的原因——相关摘录from the doc:当前消息的处理(如果有)将在actor停止之前继续,但不会处理邮箱中的其他消息.. . 如果其中一个actor没有响应(即长时间处理消息,因此没有收到停止命令),整个过程就会卡住.
-
所以,你的actor被锁定在处理当前消息并且它不知道有人想要它停止。不过,不知道如何强迫它。顺便说一下YDIW by spawning actors solely to send off actual processing,除非他们执行一些分阶段的处理。
-
感谢您的评论,尽管我敢打赌这应该是一个答案。所以,如果有一个挂起的actor,就没有办法关闭应用程序。我想到了一个简单的解决方案:如果actor内部的某些处理存在危险,我可以用Future/Await包装它,它有超时。这样我就可以保证没有演员会被绞死。我应该试试看。