【问题标题】:How to model actor with mutable collection inside?如何用内部可变集合建模演员?
【发布时间】:2015-02-25 07:40:18
【问题描述】:

我有一个具有相当复杂状态的演员,但假设它是一个列表。我想出了以下示例:

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?

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    我同意在Actor 中使用var 很好。

    作为替代方案,这是使用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】:

      当使用Akka FSM transitions 或一年前 Viktor Klang 提出的 the Minimalist Scala Actor 方法时,可以在没有变量和可变数据结构的情况下在您的 actor 中跟踪 FP。 Here 是使用这种方法进行倒计时的计数器示例。

      【讨论】:

        【解决方案3】:

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

        在 Actor 中拥有可变状态(变量)是完全可以的。事实上,这是拥有演员的主要用例。 Actor 的可变状态是线程安全的,但有一些例外。主要是你不应该 close over 在演员的接收方法中 Future 内的相互。

        【讨论】:

        • 虽然我同意你的观点,但我更喜欢通过某种方法“更新”或等效接口将这种可变状态嵌入到某个类中。这在大多数时候让我的生活变得轻松,尤其是在使用均匀采购模型和 akka-persistence 时。
        猜你喜欢
        • 2012-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 2018-01-07
        • 2011-11-12
        • 1970-01-01
        • 2012-11-28
        相关资源
        最近更新 更多