1

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

次に、アクターに実行してもらいたい動作をカプセル化します。

4

2 に答える 2

0

Stash を使用して、メールボックスをある程度制御できます。

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

于 2013-02-22T16:06:42.153 に答える
0

Akka アクターはイベント駆動型です。アクターのメールボックスからメッセージを消費する準備が整うと、アクターの receive で定義された部分関数が、渡されたメッセージで呼び出されます。

言い換えれば、「receive」は命令型の構造ではなく、次のメッセージを待つために呼び出すことはできません。あなたが望むものは、通常のメッセージパッシングを介して達成可能です。リクエスター アクターはワーカー アクターにデータを送信し、ワーカー アクターはコストのかかる操作を実行してから、応答を返します。

于 2013-02-22T12:44:53.433 に答える