声明Actor状态变量是可变的

我对Akka框架和并发概念相当陌生。 从Akka文档中,我了解到,Actor邮箱中只有一条消息会一次处理。 所以单线程一次会处理Actor的状态。 我的疑问是,所以将Actor状态/数据变量声明为可变 - 'Var'(仅当'Val'不适合时)),在并发情况下不会导致不一致的Actor状态。 我正在使用Scala进行开发。 在下面的主演员中,工作人员的详细信息存储在一个可变变量'workers'中。 它会成为并发问题吗?

class Master extends PersistentActor with ActorLogging {

    ...
    private var workers = Map[String, WorkerState]()
    ...
    }

我认为你在做什么很好。 正如你所说,Akka演员的基本保证之一是,一个演员将一次处理一条消息,因此不会存在不一致的Actor状态。

阿卡演员在概念上每个都有自己的轻量级线程,它完全屏蔽了系统的其余部分。 这意味着,不必使用锁来同步访问,你可以编写你的actor代码,而不用担心并发性。

http://doc.akka.io/docs/akka/snapshot/general/actors.html

另外,这是一件好事,你使用一个var而不是一个具有可变映射的val


考虑编码情况的另一种方式是在处理每个消息之后改变参与者的“状态”。 例如。:

class Master extends PersistentActor with ActorLogging {

  type MyStateType = ... // eg. Map[String, WorkerState], or an immutable case class - of course, feel free to just inline the type...

  def receive = handle(initState) // eg. just inline a call to Map.empty

  def handle(state: MyStateType): Actor.Receive = LoggingReceive {

    case MyMessageType(data) => 

      ... // processing data - build new state

      become(handle(newState))

    case ... // any other message types to be handled, etc.

  }

  ... // rest of class implementation

}

虽然这里确实存在可变状态(在这种情况下,它是整个演员的状态 - 它实际上变成了“非限定状态机器”),但它感觉更好的包含/隐藏(对我来说,至少),以及任何给定消息可用于演员的“状态”(或“工作人员”)都被视为完全不可变的。

链接地址: http://www.djcxy.com/p/21513.html

上一篇: Declaring Actor state variables as mutable ones

下一篇: How do I give priority to Consumers when using a LinkedBlockingQueue?