停止使用PoisonPill后,Akka演员仍可使用

时间:2015-06-23 00:25:27

标签: scala akka actor

我使用akka动态创建演员并在他们完成特定工作时将其销毁。我已经掌握了演员的创作,但不管我是如何终止演员的,他们都会阻止他们留在记忆中。最终这导致内存不足异常,尽管我在任何给定时间都应该只有少数活跃的角色。

我已经使用过:

self.tell(PoisonPill, self)

context.stop(self)

试图摧毁演员。有什么想法吗?

编辑:这里有更多的内容可以充实我想要做的事情。该计划开放并产生十个演员。

val system = ActorSystem("system")
(1 to 10) foreach { x => 
  Entity.count += 1
  system.actorOf(Props[Entity], name = Entity.count.toString())
}

这是实体的代码:

class Entity ()  extends Actor {
  Entity.entities += this
  val id = Entity.count
  import context.dispatcher
  val tick = context.system.scheduler.schedule(0 millis, 100 millis, self, "update")
  def receive = {
    case "update" => {
      Entity.entities.foreach(that => collide(that))
    }
  }
  override def postStop() = tick.cancel()
  def collide(that:Entity) {
    if (!this.isBetterThan(that)) {
      destroyMe()
      spawnNew()
    }        
  }
  def isBetterThan() :Boolean = {
    //computationally intensive logic
  }
  private def destroyMe(){
    Entity.entities.remove(Entity.entities.indexOf(this))
    self.tell(PoisonPill, self)
    //context.stop(self)
  }
  private def spawnNew(){
    val system = ActorSystem("system")
    Entity.count += 1
    system.actorOf(Props[Entity], name = Entity.count.toString())
  }  
}
object Entity {
  val entities = new ListBuffer[Entity]()
  var count = 0
}

1 个答案:

答案 0 :(得分:0)

谢谢@AmigoNico,你指出了我正确的方向。事实证明,既不是

self.tell(PoisonPill, self)

也不是

context.stop(self)

及时处理演员;我将线路切换到:

system.stop(self)

一切都按预期工作。