【问题标题】:How to properly use akka actors in scala如何在 scala 中正确使用 akka 演员
【发布时间】:2013-06-16 23:08:06
【问题描述】:

我对演员的想法比较陌生,我想知道是否可以对我的工作进行一些批评。对于项目的一部分,我需要一个演员来告诉一组正在听的演员时间。监听演员必须能够被添加到这个演员。

目前我有这个:

import akka.actor.Actor;

import akka.actor.ActorRef;
import com.github.nscala_time.time.Imports._;

class TimeManager extends Actor {
  var actors:List[ActorRef] = List();
  def receive = {
    case AdvanceTime() => actors foreach (_ ! DateTime.now)
    case AddListener(x) => actors =  x :: actors
  }
}

有什么方法可以从这段代码中删除状态(var 演员)以使其更具功能性?

【问题讨论】:

  • 最佳做法是每个子演员只有一个父母。这意味着您应该避免将 Actor(以及任何可变对象)作为消息传递给其他 Actor。尝试将参与者系统构建为层次结构 - 这样可以更好地监督和控制系统。

标签: scala akka actor


【解决方案1】:

Scala 的优势在于它混合了 OO 和函数式编程,scala 开发人员不需要讨厌var,如果你这样做,你可能需要选择 Haskell。

就您而言,我认为您唯一需要更改的是将actors 设为private

【讨论】:

    【解决方案2】:

    您不能删除状态,因为TimeManager 应该包含演员列表。

    你可以隐藏它:

    class TimeManager extends Actor {
      def receive = getBehavior(Nil)
      def getBehavior(actors: List[ActorRef]): Receive = {
        case AdvanceTime() => actors foreach (_ ! DateTime.now)
        case AddListener(x) => context become getBehavior(x :: actors)
      }
    }
    

    【讨论】:

    • 哇,become 的有趣用法!
    • 我正试图弄清楚。 getBehavior 的返回类型为 Receive。因此,当我们调用 context become getBehavior 时,它不能接受任何参数,因为发送给参与者的消息要么使用 receive 和一些“成为”的方法进行处理——这些方法不接受任何论据。正确的?那么什么会为getBehavior 提供参数呢?
    • @Alex: it can't take any arguments - 为什么? Receive 实际上是一个PartialFunction,所以getBehavior 接受List 作为参数并创建一个PartialFunction。而这个PartialFunctionActor 用来处理消息。方法receive 提供默认行为。之后become 方法receive 将不再使用。
    • 我很难理解成为什么。当我调用“become(myFunc)”时,这意味着从那时起所有消息将转到myFunc,对吗?
    • > -- 因为我们只能发送一条消息,我们不能调用“receive”直接向它提供参数。
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 2018-05-23
    • 2016-01-24
    • 2019-04-23
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多