斯卡拉演员 - 最糟糕的做法?

teo*_*teo 49 scala actor akka

我觉得在Scala中使用actor有点不安全.我已经阅读了有关如何做东西的文档,但我想我还需要一些DO NOT规则才能随意使用它们.我想我会害怕以错误的方式使用它们,我甚至都不会注意到它.

你能想到一些东西,如果应用的话,会导致Scala演员带来的好处,甚至是错误的结果吗?

oxb*_*kes 55

  • !?尽可能避免.你得到一个锁定的系统!

  • 始终从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用于你的主要演员,Actor而是使用sublcass .这样做的原因是只有通过子类化才能提供合理的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 }
}
Run Code Online (Sandbox Code Playgroud)
  • 将你的演员链接在一起并使用trapExit = true- 否则他们可以默默地失败意味着你的程序没有按照你的想法行事,并且可能会因为消息留在演员的邮箱中而内存不足.

  • 我认为在这里这里强调围绕使用演员做出的设计决策的一些其他有趣的选择

  • *@ Michael* - 如果您没有自己明确声明一个Actor,那么将为您创建一个,并将`Thread`绑定为`ThreadLocal`.我完全不清楚这种方法是逻辑上安全还是没有内存泄漏.明确声明一个更简单 (2认同)

Dig*_*oss 12

我知道这并没有真正回答这个问题,但至少应该理解基于消息的并发性比基于共享内存线程的并发性更不容易出现错误.

我认为你已经在Scala编程中看到了演员指南,但是为了记录:

  • 处理消息时,参与者不应该阻止.您可能希望阻止尝试安排稍后获取消息.
  • 使用react {}而不是receive {}尽可能使用.
  • 仅通过消息与演员沟通.
  • 喜欢不可变的消息.
  • 使消息自包含.