gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:30:35 36 4
gpt4 key购买 nike

假设我有一些类,其属性 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com