Scala演员-最糟糕的做法?
我觉得在Scala中使用演员有点不安全。我已经阅读了关于如何做事情的文档,但我想我还需要一些禁忌规则,以便能够自由地使用它们。 我想我担心我会以错误的方式使用它们,我甚至不会注意到这一点Scala演员-最糟糕的做法?,scala,akka,actor,Scala,Akka,Actor,我觉得在Scala中使用演员有点不安全。我已经阅读了关于如何做事情的文档,但我想我还需要一些禁忌规则,以便能够自由地使用它们。 我想我担心我会以错误的方式使用它们,我甚至不会注意到这一点 你能想到一些东西,如果应用,会破坏Scala参与者带来的好处,甚至是错误的结果吗 我知道这并不能真正回答问题,但您至少应该鼓起勇气,基于消息的并发比基于共享内存线程的并发更不容易出现wierd错误 我想您已经在Scala编程中看到了演员指南,但请注意: 参与者在处理消息时不应阻塞。在您可能要阻止的位置,请尝试
你能想到一些东西,如果应用,会破坏Scala参与者带来的好处,甚至是错误的结果吗 我知道这并不能真正回答问题,但您至少应该鼓起勇气,基于消息的并发比基于共享内存线程的并发更不容易出现wierd错误 我想您已经在Scala编程中看到了演员指南,但请注意:
- 参与者在处理消息时不应阻塞。在您可能要阻止的位置,请尝试安排稍后获取消息
- 尽可能使用
而不是react{}
receive{}
- 仅通过消息与参与者沟通
- 喜欢不可变的消息
- 使消息独立
- 避免
只要可能。你会得到一个锁定的系统代码>
- 始终从参与者子系统线程发送消息。如果这意味着通过
方法创建一个临时Actor,那么就这样吧:Actor.Actor
case按钮点击(src)=>Actor.Actor{controller!SaveTrade(trdFld.text)}
- 在参与者的反应中添加“任何其他消息”处理程序。否则,无法确定您是否向错误的参与者发送了信息:
case other=>log.warning(此+“已收到意外消息”+other
- 不要对主要参与者使用
,而应使用subcassActor.Actor
。原因是只有通过子类化,才能提供合理的Actor
方法。同样,如果日志中充斥着以下语句,调试参与者非常困难:toString
12:03[INFO]向scala.actors.Actor$anonfun$1发送请求交易(2009-10-12)
- 记录系统中的参与者,明确说明他们将收到什么消息,以及他们应该如何精确计算响应。使用参与者会导致标准过程的转换(通常封装在方法中)要成为跨多个参与者反应的逻辑,没有好的文档很容易迷失方向
- 始终确保您可以在参与者的
循环之外与参与者进行通信,以查找其状态。例如,我始终声明一个方法,该方法将通过react
调用,该方法类似于下面的代码段。否则,很难判断参与者是否正在运行、是否已关闭、是否有大量的我信使等MBean
- 将您的参与者链接在一起并使用
——否则他们可能会无声地失败,这意味着您的程序没有按照您认为的那样运行,并且可能会随着消息留在参与者邮箱中而耗尽内存trapExit=true
- 我认为,围绕使用参与者做出的设计决策,还有一些有趣的选择已经得到了强调和讨论
ThreadLocal
绑定到Thread
。我一点也不清楚这种方法在逻辑上是安全的还是没有内存泄漏。显式声明一个(myActor.getState==scala.actors.Actor.State.Suspended)
在参与者在react
中等待时为true,那么我们真的需要您建议的方法来查找状态吗?这个问题中的代码有任何问题吗?
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 }
}