我正在为Akka写我的HelloWorld,我修复了(20到50)在主要演员中创建的演员数量,其中一半是简单的计数器,另一半计算阶乘,并以某种方式求和结果。 主要目标是测试Akka如何处理顽皮的悬挂线程。我将半随机时间的Thread.sleeps添加到我的线程中,并通过安排特殊的ForceShutdown案例来定义超时。
我想要得到:
我得到了什么: 1和2正在运作,但是:
我尝试了几种ForceShutdown案例,但大多数都是一样的,等待儿童演员完成未完成的工作。 这是一个例子:
case ForceShutdown =>
println(s"[${self.path.name}] ForceShutdown received!")
children foreach { child => system.stop(child) }
system shutdown
那么,如何强制终止Akka中的演员?
答案 0 :(得分:2)
在JVM上无法强制关闭任何内容,因为在同一进程中终止某些内容可能会破坏共享状态并导致应用程序损坏。你对Future的想法最初会起作用,但是运行你的失控代码的线程池不会关闭,这意味着JVM不会停止或将累积已经失效的线程池并最终耗尽内存。
因此,您应该设计所有演员以保持响应:如果您需要运行较长的处理任务,您应该将它们分解为演员发送给自己的短步骤。这样终止请求将在适当的时候兑现。
答案 1 :(得分:0)
akka完全是异步过程。即使Kill
消息需要等到当前任务完成。它只是Kill
获得最高优先级,因此邮箱排队的邮件将被忽略,而PoisonPill
就像普通邮件一样,最后会被处理。所以排队的消息必须在演员关闭之前正常处理。