我已经使用 Akka 及其 Java API UntypedActor 实现了一个 Actor 系统。其中,一个参与者(A 类)使用 getContext().actorOf(...);
按需动态启动其他参与者(B 类)。那些 B Actor 会做一些 A 不再关心的计算。但是我想知道:那些B型 Actor 完成后是否有必要清理他们?如果有,怎么做?
- 通过让 B Actor 在完成后调用
getContext().stop(getSelf())
? - 通过让 B Actor 在完成后调用
getSelf().tell(Actors.poisonPill());
? [这是我现在正在使用的]。 - 什么都不做?
- 由...?
文档对此并不清楚,或者我忽略了它。我对 Scala 有一些基本的了解,但 Akka 的源代码并不完全是入门级的东西......
最佳答案
您所描述的是根据“请求”(在 A 的上下文中定义)创建的单一用途参与者,它们处理一系列事件然后完成,对吗?这绝对没问题,你关闭它们是对的:如果你不这样做,它们会随着时间的推移而积累,你会遇到内存泄漏。最好的方法是您提到的第一种可能性(最直接),但第二种也可以。
一些背景知识:actor 在其父级中注册以便可识别(例如,在远程处理中需要,但在其他地方也需要),并且此注册可防止它们被垃圾收集。 OTOH,每个 parent 都有权访问它创建的 child ,因此没有自动终止(即通过 Akka)是有意义的,而是需要在用户代码中显式关闭。
关于java - Akka:动态创建的 Actor 完成后需要清理它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9569682/