假设我的某个类的属性actor_
类型为Actor
。我这样做有什么问题
def someMethod() = {
actor_ ! "HELLO"
}
或者应该始终从另一个演员发送消息; e.g。
def someMethod() = {
Actor.actor { actor_ ! "HELLO" }
}
答案 0 :(得分:8)
这取决于。当您从非演员代码向演员发送消息时,会自动创建ActorProxy并将其存储在本地线程中。这会产生潜在的内存泄漏,尽管是非常小的内存泄漏,因为在线程为GC之前,ActorProxy不会进行GC。 ActorProxy实质上使非actor线程在很多方面都像Actor一样,包括接收消息。
更大的问题是如果你的线程被管理,类似于actor库管理线程的方式,那么代表逻辑上下文的东西可能同时在一个线程上,而在另一个时间在另一个线程上。一个很好的例子是servlet容器。您的逻辑上下文可能是servlet或会话,但ActorProxy将绑定到该线程,因此跨逻辑上下文共享。如果你的演员不回复ActorProxy,这不是什么大问题,但如果他们是,它可能会导致问题,因为(a)回复可能会被错误的上下文接收,或者(b)永远不会收到消息,因此前面提到的小泄漏会变得很大,因为ActorProxies的邮箱会填满。
[编辑] 嗯......我似乎在阅读问题时遇到了问题!在actor块中包围它会创建一个新的actor对象,当它终止时将正确GC。请记住,将消息发送到actor块意味着消息发送将在另一个线程的新响应中完成,而不是在创建actor的线程中完成。
答案 1 :(得分:0)
我没有看到这样做的问题。如果它在您的代码中有意义,那么为什么不呢? 如果你看一下纯粹的演员模特,一切都是一个演员,只有演员互相沟通,如果你能像这样设计你的代码......如果你不能或不想那么就可以发送从非演员到演员的消息。