[英]Scala actors - worst practices?
我觉得在Scala中使用actor有点不安全。 我已经阅读了有关如何做东西的文档,但我想我还需要一些DO NOT规则才能随意使用它们。 我想我会害怕以错误的方式使用它们,我甚至都不会注意到它。
你能想到一些东西,如果应用的话,会导致Scala演员带来的好处,甚至是错误的结果吗?
避免!?
尽可能。 你会得到一个锁定的系统!
始终从Actor子系统线程发送消息。 如果这意味着通过Actor.actor
方法创建一个临时Actor,那么就这样吧:
case ButtonClicked(src) => Actor.actor { controller ! SaveTrade(trdFld.text) }
为你的演员的反应添加“任何其他消息”处理程序。 否则,无法确定您是否向错误的演员发送消息:
case other => log.warning(this + " has received unexpected message " + other
不要将Actor.actor
用于主要演员,而是使用sublcass Actor
。 这样做的原因是只有通过子类化才能提供合理的toString
方法。 如果您的日志充斥着如下语句,那么调试actor非常困难:
12:03 [INFO] Sending RequestTrades(2009-10-12) to scala.actors.Actor$anonfun$1
记录系统中的actor,明确说明他们将收到哪些消息以及他们应该如何计算响应。 使用actor会导致标准过程的转换(通常封装在方法中),从而成为跨多个actor反应的逻辑。 没有好的文档很容易丢失。
始终确保您可以在其react
循环之外与您的actor通信以查找其状态。 例如,我总是声明一个通过MBean
调用的方法,它看起来像下面的代码片段。 否则,很难判断你的actor是否正在运行,是否已关闭,是否有大量消息等。
。
def reportState = {
val _this = this
synchronized {
val msg = "%s Received request to report state with %d items in mailbox".format(
_this, mailboxSize)
log.info(msg)
}
Actor.actor { _this ! ReportState }
}
我知道这并没有真正回答这个问题,但至少应该理解基于消息的并发性比基于共享内存线程的并发性更不容易出现错误。
我认为你已经在Scala编程中看到了演员指南,但是为了记录:
react {}
而不是receive {}
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.