加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 与演员使用“var”状态的替代方案?

发布时间:2020-12-16 09:29:48 所属栏目:安全 来源:网络整理
导读:我发现自己使用vars相当经常与akka演员保持状态。例如,如果我的演员需要维护一个项目列表,我可能会这样做: class ListActor extends Actor{ var xs : List[Int] = List() def receive = { case x : Int = xs = x :: xs }} 使用可变变量似乎违背了Scala的
我发现自己使用vars相当经常与akka演员保持状态。例如,如果我的演员需要维护一个项目列表,我可能会这样做:

class ListActor extends Actor{
  var xs : List[Int] = List()

  def receive = {
    case x : Int => xs = x :: xs
  }
}

使用可变变量似乎违背了Scala的精神。或者我用这个:

class ListActor2 extends Actor{
  import context._

  def collect_ints(accu : List[Int]) : Receive = {
    case x : Int => become(collect_ints(x :: accu))
  }

  def receive = collect_ints(Nil)
}

我喜欢这样看起来更多,但是我必须担心堆栈溢出?

我知道FSM的特质,并且也在之前使用过,但在某些情况下,它似乎太多了。

维护简单状态的推荐方法是什么?还有其他的替代品,我不知道吗?

另外,如果我经常发现自己需要可变变量,这通常是一个坏的标志?我没有正确使用演员模型吗?

解决方法

在actor模型中,我没有看到var的简单状态的任何问题。

通过设计,Akka通过并发访问状态变量来防止演员的状态被破坏或锁定。

只要您不使用Future for instance将其状态暴露给其他线程,则使用var进行简单状态不应该是一个问题。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读