如何终止一个悬空的akka演员?

史蒂夫·奥勒斯

我正在为Akka写我的HelloWorld,我已经固定(20到50个)在主要演员中创建的演员数量,其中一半是简单的计数器,另一半用于计算阶乘并以某种方式对结果求和。主要目标是测试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强制终止悬空的演员呢?

罗兰·库恩

在JVM上,无法强制关闭任何内容,因为在同一进程中终止某些内容可能会破坏共享状态并导致应用程序损坏。您对Future的想法一开始似乎会起作用,但是运行您的失控代码的线程池不会关闭,这意味着JVM不会停止,也不会累积已失效的线程池,并最终耗尽内存。

因此,您应该设计所有参与者以保持响应速度:如果您需要运行长时间的处理任务,则应将其分解为参与者发送给自己的简短步骤。这样,终止请求将在适当的时候得到满足。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章