1

我想用 akka 2.1 实现高级通信模式。然而,akka 似乎在一个关键方面与 Scala 的演员不同。scala 的 actor 允许我主动调用“receive”并提供部分函数,​​akka 的 actor 采用好莱坞“不要打电话给我们,我们会打电话给你”的原则,让你只静态定义一个接收函数。

在 scala 的演员中,我可以有这样的模式:

class MyActor extends Actor{

  override def act(){
    val x = expensiveFunc()
    friend ! x
    val y = receive {
      case Answer(a) => println(a)
    }
  }

}

在这里,我明确地拨打接收电话。这样做的原因是我需要每个执行 SPMD 程序并在执行中的特定点进行通信的自治参与者。是否可以以有意义的方式使用 AKKA 来模拟这种模式?


编辑 我想全面了解我的问题是公平的。

我需要使用演员创建一个 SPMD 程序。这意味着我需要能够为演员定义行为,这不仅是反应性的,即我需要能够像在旧的 scala 演员中那样实现act() 。此外,我需要像在旧的 scala 演员中那样显式调用receive(p:PartialFunction[T,U]) 。

如果我能做到以上两件事,我将能够将我的 SPMD 程序从老演员移植到 akka 演员。然而,我怀疑由于AKKA 似乎采用的好莱坞模式( http://en.wikipedia.org/wiki/Hollywood_principle ),不可能实现行为方法。

EDIT2 我相信主动接收问题可以通过成为/不成为这样的方式来解决:

  import context._
  def receive(p:PartialFunction[Any,Unit]){
    become(p)
    receive()
    unbecome()
  }

但是,这要求允许嵌套调用接收。我有机会通过简单地发送如下消息来模拟act方法:

case class Act(b: ()=> Unit) extends Serializable

然后封装了我希望我的演员执行的行为。

4

2 回答 2

0

Akka actor 是事件驱动的。每当消息准备好从actor邮箱中消费时,actor中receive中定义的部分函数就会调用传入的消息。

换句话说,“receive”不是命令式构造,您不能调用它来等待下一条消息。您想要的可以通过正常的消息传递来实现。请求者 Actor 将数据发送给 worker Actor,后者执行代价高昂的操作,然后发回回复。

于 2013-02-22T12:44:53.433 回答
0

您可以使用 Stash 对邮箱进行一些控制:

http://doc.akka.io/docs/akka/2.1.0/scala/actors.html#Stash

于 2013-02-22T16:06:42.153 回答