使用Actors时,将常规方法调用与消息混合使用?

时间:2012-03-11 18:37:22

标签: scala lift actor

我正在写一个彗星应用程序,我的一些演员有其他演员的引用,例如用户A有演员B,它有一个变量存储演员C,与用户D相关联。

A的一些用户操作应该导致他们的演员B向演员C发送消息。

这些事情由用户A触发。

我的问题是,是否可以在actor B上调用常规方法,这会导致它向C发送消息,或者我应该将消息发送给它接收的A,然后将消息发送给B. / p>

把它放在代码中,这样的事情还可以:

//in some snippet:
val actorB: ActorB = session.map(.findCometActor(...))
"#some-button" #> SHtml.ajaxInvoke(() => actorB.sendIt(777)) //is this ok?

//the actors:
case class MyMessage(someInt: Int, someString: String)
class ActorB extends CometActor {
  private var someString = ""
  private var otherActor: Box[CometActor] = Empty

  def sendIt(someInt: Int) = otherActor ! MyMessage(someInt, someString)
}
class ActorC extends CometActor {
  def lowPriority = {
    case MyMessage(num, str) => println(num + str)
  }
}

或者片段代码是否应该向演员B发送消息,演员B然后会向演员C发送消息而不是直接呼叫actorB.sendIt(777)

编辑:只是为了确认,这样做没有任何技术问题,它更多的是关于样式,并希望更容易使代码更正。是吗?

2 个答案:

答案 0 :(得分:4)

actor模型最关键的特性之一是,每个传入消息的处理都会更新actor atomically 。如果你直接调用一个方法,这个原子性就会被打破,你将面临很大的复杂问题,比如自己处理协调或使用显式锁。

答案 1 :(得分:1)

不要直接调用它 - 即使它看起来不错,这实际上并不是这样。如果你要访问someString,你应该用锁来保护它,但事实并非如此。

通常,Actors使用Actor范例。它保留在使代码易于推理的范例中......这并不容易推理,并且随着它变得越来越复杂,它将变得更糟。向B发送消息,告诉B向C发送消息,如您所示。