声明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?