【问题标题】:Why is Akka Kill not terminating this supervisor and its children?为什么 Akka Kill 不终止这个主管及其孩子?
【发布时间】:2014-11-18 00:42:44
【问题描述】:

我在下面有一个主管,它使用默认的 Play! 创建子进程! 2.2Akka.system。当我试图立即杀死主管时,什么都没有发生,它会继续处理。

class ImportSupervisor extends Actor {

        import akka.actor.AllForOneStrategy
        import akka.actor.SupervisorStrategy._
        import scala.concurrent.duration._

        val log = Logging(context.system, this)
        override val supervisorStrategy =
          AllForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 hour) {
            case e: Exception => Stop
          }

        override def preStart() {
          Logger.info("supervisor starting up at "+self.toString)
        }

        def receive = {
          case p: Props => context.actorOf(p)
        }
      }

下面是我用来杀死有大约 1000 个孩子的主管的代码:

Akka.system.actorSelection("akka://application/user/"+actorName) ! Kill

我可以验证我得到的 ActorPath 是正确的,但问题是 Kill 不会立即生效。我对Stop 进行了同样的尝试。我究竟做错了什么?假设它会立即关闭是错误的吗?

【问题讨论】:

  • 按照设计,Akka 从不保证任何事情都会“立即”执行,甚至在特定延迟之后执行。例如,当安排一个任务在“2 秒”内执行时,您不应该假设它会在 2 秒内有效地运行。

标签: scala playframework-2.0 akka


【解决方案1】:

假设它会立即关闭是错误的吗?

是的。

Kill 消息将像任何其他消息一样在参与者的邮箱中排队。如果前面还有其他消息,或者 actor 正忙于处理另一条消息,Kill 消息将不得不等待。

所有这些都在文档中进行了解释:

http://doc.akka.io/docs/akka/2.2.4/scala/actors.html#Stopping_actors

【讨论】:

  • 就是这么想的,但是问题中提到的Stop 呢?我读了同一个文档,我是否误解了Stop 会做同样的事情?或者我需要设置一个主管的主管来做到这一点?
  • 你不能在 Akka 中立即停止演员。正如文档所说,“actor 的实际终止是异步执行的,即stop 可能会在actor 停止之前返回。” KillActorRef.stop 之间的区别仅在于已故演员的主管如何处理它。
  • 我意识到实现这一点的方法不是依赖 Actor 或 Supervisor 本身,而是为任务创建一个特定的 ActorSystem。这样如果需要立即关机,可以拨打actorSystem.shutdown()
  • 这是个坏主意。 ActorSystems 是重量级的,你应该很少创建多个。而ActorSystem.shutdown 仍然是异步的。
  • 确实如此,幸运的是,对于我的特定任务,它不是用于生产用途。相反,我正在处理一个大型流操作。在某些时候,我需要终止进程以分析我流式传输的数据(并恢复 CPU)。不过你是完全正确的。
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多