java - Akka:动态创建的 Actor 完成后需要清理它们吗?

标签 java akka resource-cleanup

我已经使用 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/

相关文章:

java - 为什么从 java 9 PhantomReference java doc 开始,它专门用于 POST-mortem 清理操作,尽管它之前是 PRE-mortem

Java EE 将 Controller 类与 DAO 类连接

java - 为什么 Vaadin 11.0.0 应用程序中未显示网格?

scala - Akka Stateful Actor 跨节点复制

java - 用于计算任务的 Akka 模型

javascript - 如何防止 TinyMCE 5 删除\r\n

garbage-collection - 文件周围的类包装器——不再引用时关闭文件句柄的正确方法

java - 用于获取前 k 个股票价格的股票行情数据结构

Java 8 列表处理 - 有条件地添加元素

java - 创建一个 ActorSelection 以获取在父 Actor 中创建的 ActorRef