我使用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
}
答案 0 :(得分:0)
谢谢@AmigoNico,你指出了我正确的方向。事实证明,既不是
self.tell(PoisonPill, self)
也不是
context.stop(self)
及时处理演员;我将线路切换到:
system.stop(self)
一切都按预期工作。