scala - 从非 Actor 那里向 Actor 发送消息是一种不好的做法吗?

标签 scala actor

假设我有一些类,其属性 actor_ 类型为 Actor。我这样做有问题吗

def someMethod() = {
  actor_ ! "HELLO"
}

或者应该始终由另一个参与者发送消息;例如

def someMethod() = {
  Actor.actor { actor_ ! "HELLO" }
}

最佳答案

这要看情况。当您从非参与者代码向参与者发送消息时,会自动创建 ActorProxy 并将其存储在线程本地中。这会造成潜在的内存泄漏,尽管泄漏很小,因为在线程被 GC 之前,ActorProxy 不会被 GC。 ActorProxy 本质上使非 Actor 线程在许多方面表现得像 Actor,包括接收消息。

更大的问题是,如果您的线程受到管理,类似于actor库管理线程的方式,那么表示逻辑上下文的内容可能有时位于一个线程上,而另一时间位于另一个线程上。 Servlet 容器就是一个很好的例子。您的逻辑上下文可能是 servlet 或 session ,但 ActorProxy 将绑定(bind)到线程,从而在逻辑上下文之间共享。如果你的 Actor 没有回复 ActorProxy,这并不是什么大问题,但如果他们这样做,则可能会导致问题,因为(a)回复可能会被错误的上下文接收,或者(b)消息永远不会被接收到,因此,当 ActorProxies 的邮箱被填满时,前面提到的小泄漏就会变成大泄漏。

[编辑] 嗯...我似乎在阅读问题时遇到了问题!在 actor block 中围绕它创建一个新的 actor 对象,该对象在终止时将被正确 GC。请记住,将消息发送放在 actor block 中意味着消息发送将在另一个线程上的新 react 中完成,而不是在创建 actor 的线程中完成。

关于scala - 从非 Actor 那里向 Actor 发送消息是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1058408/

相关文章:

Akka Actor 查找或依赖注入(inject)

scala - 用于向 Scala Actors 发送消息的符号或案例类?

scala - 使用类型为编译时检查的任意约束建模

performance - 为什么scalac在某些场景下不能优化尾递归?

oracle - 使用 Spark 1.6.2 JDBC 读取 Oracle 数据的并行性

Akka Actor 从数据库读取状态

java - 是否有理由使用 Scala 的 StringLike.replaceAllLiterally 而不是 Java 的 String.replace?

Scala 泛型 : type mismatch

android - libgdx 中 Actor 的操作

exception - Service Fabric Actor 远程调用导致 "Specified cast is not valid."异常