向演员发送不是演员的信息是不好的做法吗?

oxb*_*kes 10 scala actor

假设我有一些具有actor_类型属性的类Actor.我做的有问题吗?

def someMethod() = {
  actor_ ! "HELLO"
}
Run Code Online (Sandbox Code Playgroud)

或者应该始终从另一个演员发送消息; 例如

def someMethod() = {
  Actor.actor { actor_ ! "HELLO" }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*cht 8

这取决于.当您从非演员代码向演员发送消息时,会自动创建ActorProxy并将其存储在本地线程中.这会产生潜在的内存泄漏,尽管是非常小的内存泄漏,因为在线程为GC之前,ActorProxy不会进行GC.ActorProxy实质上使非actor线程在许多方面表现得像Actor,包括接收消息.

更大的问题是如果您的线程被管理,类似于actor库管理线程的方式,那么表示逻辑上下文的内容可能同时在一个线程上,而在另一个时间在另一个线程上.一个很好的例子是servlet容器.您的逻辑上下文可能是servlet或会话,但ActorProxy将绑定到该线程,因此跨逻辑上下文共享.如果你的演员不回复ActorProxy,这不是什么大问题,但如果他们是,它可能会导致问题,因为(a)回复可能会被错误的上下文接收,或者(b)永远不会收到消息,因此前面提到的小泄漏会变得很大,因为ActorProxies的邮箱会填满.

[编辑]嗯......我在阅读问题时似乎有问题!在actor块中包围它会创建一个新的actor对象,当它终止时将正确GC.请记住,将消息发送到actor块意味着消息send将在另一个线程的新响应中完成,而不是在创建actor的线程中完成.