[英]How to model actor with mutable collection inside?
我有一個演員,狀態很復雜,但可以說是一個清單。 我提出了以下示例:
class Account
class Bank extends Actor {
var accounts = List[Account]()
def receive = {
case x: Account =>
accounts ++= List(x)
println(accounts.length)
case _ =>
}
}
基本上,我希望這個演員包裝列表,並且我希望能夠通過以下方式添加到該集合:
val system = ActorSystem("banks")
val bankActor = system.actorOf(Props[Bank], name = "mybank")
bankActor ! new Account
我在寫這個演員,甚至是接近最佳和安全嗎? 有沒有引入var的更好方法?
有沒有引入var的更好方法?
在Actor中具有可變狀態(var)是完全可以的。 實際上,這是擁有參與者的主要用例。 Actor的可變狀態是線程安全的,但有一些例外。 最主要的是,您不應該在演員的接收方法中close over
“ Future
內部的相互關系。
我同意在Actor
中使用var
很好。
作為一種替代方法,這是避免使用var
的另一種使用become
的方法。
class Bank extends Actor {
def receive = receiveAccounts(List.empty)
def receiveAccounts(accounts: List[Account]): Receive = {
case x: Account =>
println(accounts.length + 1)
context.become(receiveAccounts(x :: accounts))
case _ =>
}
}
當使用Akka FSM轉換或Viktor Klang一年前提出的極簡Scala Actor的方法時,可以在演員中使用沒有變量和可變數據結構的FP。 這是使用此方法遞減計數的計數器的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.