簡體   English   中英

如何在內部使用可變集合對演員建模?

[英]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 overFuture內部的相互關系。

我同意在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM