我想用akka 2.1实现高级通信模式。 然而,akka在一个关键方面似乎与Scala的演员不同。在scala的演员允许我主动调用“接收”并提供部分功能的地方,akka的演员采用好莱坞“不要打电话给我们,我们会打电话给你”原则,让你只是静态定义接收功能。
在scala的演员中,我可以有这样的模式:
class MyActor extends Actor{
override def act(){
val x = expensiveFunc()
friend ! x
val y = receive {
case Answer(a) => println(a)
}
}
}
在这里,我明确地拨打电话接收。这样做的原因是我需要自主角色,每个角色执行SPMD程序并在执行中的特定点进行通信。 是否有可能以有意义的方式使用AKKA模拟这种模式?
修改 我想彻底了解我的问题是公平的。
我需要使用actor创建一个SPMD程序。这意味着我需要能够为不的演员定义行为只是被动的,即我需要能够像旧的scala演员一样实现 act()。 此外,我需要明确地调用接收(p:PartialFunction [T,U]),就像我在旧的scala actor中那样。
如果我可以做上述两件事,我将能够将我的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
然后封装了我希望演员执行的行为。
答案 0 :(得分:0)
Akka演员是事件驱动的。每当消息准备好从actors邮箱中消费时,将调用actor中receive中定义的partial函数并传入消息。
换句话说,“接收”不是命令式构造,您不能将其称为等待下一条消息。您想要的是通过正常的消息传递实现的。请求者actor将数据发送给worker actor,后者执行昂贵的操作,然后发回回复。
答案 1 :(得分:0)
您可以使用Stash控制您的邮箱: