akka 2.1 で高度な通信パターンを実装したいと考えています。ただし、akka は重要な側面で Scala のアクターとは異なるようです。scala のアクターは積極的に "receive" を呼び出して部分的な関数を提供することができますが、akka のアクターはハリウッドの「私たちに電話しないで、あなたに電話します」という原則を採用し、静的に受信関数のみを定義できるようにします。
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]) を呼び出す必要があります。
上記の 2 つのことができれば、SPMD プログラムを古いアクターから akka アクターに移植することができます。しかし、AKKA が採用しているように見えるハリウッド パターン ( http://en.wikipedia.org/wiki/Hollywood_principle )のために、act メソッドを実装することはできないのではないかと思います。
EDIT2アクティブな受信の問題は、次のようなbecome/unbecomeで解決できると思います:
import context._
def receive(p:PartialFunction[Any,Unit]){
become(p)
receive()
unbecome()
}
ただし、これには、受信するネストされた呼び出しが許可されている必要があります。次のようなメッセージを送信するだけでactメソッドをエミュレートできる可能性があります。
case class Act(b: ()=> Unit) extends Serializable
次に、アクターに実行してもらいたい動作をカプセル化します。