关于Actor Worst Practices的问题,其中一位answers说:
始终从Actor子系统线程发送消息。如果这意味着 通过Actor.actor方法创建一个瞬态Actor然后就这样吧:
case ButtonClicked(src) => Actor.actor { controller ! SaveTrade(trdFld.text) }
答案写于2009年。这目前是一个好习惯吗?它适用于Akka演员吗?
我认为我的问题不是Is it bad practice to send an actor a message from something which is not an actor?的重复,因为这是指演员系统的较旧实现。它确实解释了“最差实践”背后的理由。
答案 0 :(得分:4)
不,Akka没有旧Scala演员所拥有的问题,可能会为每个线程创建ActorProxy
,然后在其不断增长的邮箱中泄漏内存。
让我们看一下!
:
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit
如果您要发送邮件,并且您不在另一个Actor
内,则发件人默认为Actor.noSender
。引用文档:
默认占位符(null)用于"!"表明没有 邮件的发件人,将被转换为收件人 系统的死信。
如果您要发送的演员试图回复,您将收到死信。如果需要,可以记录这些,但它们不会导致内存泄漏。