如何在里面用可变集合模拟actor?

时间:2014-12-29 04:35:46

标签: scala akka

我有一个状态相当复杂的演员,但我们说它是一个列表。我提出了以下例子:

class Account
class Bank extends Actor {
  var accounts = List[Account]()
  def receive = {
    case x: Account =>
      accounts ++= List(x)
      println(accounts.length)
    case _ => 
  }
}

基本上我希望这个actor包装List,我希望能够通过以下方式添加到该集合:

val system = ActorSystem("banks")
val bankActor = system.actorOf(Props[Bank], name = "mybank")
bankActor ! new Account

我写这个演员甚至接近最佳和安全吗?有没有更好的方法,没有引入var?

3 个答案:

答案 0 :(得分:8)

  

有没有更好的方法,没有引入var?

在Actor中拥有可变状态(vars)是完全可以的。事实上,这是拥有演员的主要用例。 Actor的可变状态是线程安全的,只有少数例外。主要的是你不应该close over在actor的receive方法中Future内的相互作用。

答案 1 :(得分:5)

我同意在var中使用Actor即可。

作为替代方案,这是另一种使用become避免var的方法。

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 _ =>
  }
}

答案 2 :(得分:2)

使用Akka FSM transitions时,可以在演员中使用不带变量和可变数据结构的FP,或者在Viktor Klang年前提出的the Minimalist Scala Actor中进行操作。 Here是使用此方法倒计时的计数器示例。