Scala 自主AKKA演员呼叫主动接收

Scala 自主AKKA演员呼叫主动接收,scala,dependency-injection,akka,actor,Scala,Dependency Injection,Akka,Actor,我想用akka 2.1实现高级通信模式。 然而,akka似乎在一个关键方面与Scala的演员不同。scala的演员允许我主动调用receive并提供一个部分函数,akka的演员采用好莱坞的“不给我们打电话”原则,让我们静态地定义一个receive函数 在scala的演员中,我可以有这样的模式: class MyActor extends Actor{ override def act(){ val x = expensiveFunc() friend ! x val

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

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

class MyActor extends Actor{

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

}
  import context._
  def receive(p:PartialFunction[Any,Unit]){
    become(p)
    receive()
    unbecome()
  }
在这里,我明确地打电话来接收。原因是我需要自治的参与者,每个参与者都执行一个SPMD程序,并在执行过程中的特定点进行通信。 有没有可能用AKKA以一种有意义的方式来模拟这种模式

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

我需要使用actors创建一个SPMD程序。这意味着我需要能够定义参与者的行为,这不仅仅是反应性的,也就是说,我需要能够实现旧scala参与者的行为。 此外,我需要显式调用receivep:PartialFunction[T,U],就像我在旧的scala actors中所做的那样

如果我能做到以上两件事,我将能够将我的SPMD程序从老演员移植到akka演员。然而,我怀疑由于AKKA似乎采用的好莱坞模式,不可能实施act方法

编辑2 我相信活动接收问题可以通过以下方式解决:

class MyActor extends Actor{

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

}
  import context._
  def receive(p:PartialFunction[Any,Unit]){
    become(p)
    receive()
    unbecome()
  }
但是,这要求允许接收嵌套调用。我有可能通过发送如下消息来模拟act方法:

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

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

Akka演员是事件驱动的。每当从actors邮箱发送的消息准备好使用时,就会调用actor中receive中定义的partial函数,并传递消息


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

您可以使用“隐藏”来控制邮箱:


也许最好的方法是使用每个参与者都是有状态的,即friend是一个特定的参与者!所以,我将使用询问模式:朋友?x将给你一个未来,你可以做等待。例如,为了得到结果,或者像未来一样成功{printlna}我编辑了这个问题来澄清。所有参与者都做有意义的工作,拥有不同的数据。朋友是特定的参与者,可以是远程的,也可以是本地的。这里不应该有大师级演员。你说的自我信息是什么意思?我正在开发的框架非常复杂,完全不考虑主/从模式,以实现更高的效率和可扩展性。因此,参与者需要有状态并执行SPMD程序,以便跟踪全局状态。虽然这绝不是使用AKKA的理念,但AKKA是提供可靠消息传递的完美后端。我必须避免使用这种方法以最大限度地提高性能。发送要处理的数据对我的系统造成了很大的瓶颈,并产生了主/从系统。这对我的程序不起作用。