2012-03-30 6 views
2

一連のリモートコールをチャンクに分割する必要があります。私は俳優を使うことを考えました。タスクの完了を報告するスカラーアクターはどうすればよいですか?

私はこのような何かを考えた:

class ControlActor() extends Actor{ 
    var counter = 1000 
    def act{ 
    for (i <- 1 until 1000) { new RequestActor(this) start } 
    while(true){ 
     receive{ 
     case "Stop" =>{counter = counter-1; if(counter==0){return}} 
     } 
    } 
    } 
} 

class RequestActor(parent:ControlActor) extends actor{ ... } 

が、これは明らかに問題があります:私はレシーブブロックに入るとき、いくつかのRequestActorインスタンスがすでに実行され終了している可能性があります。まだメッセージ受信状態になっていない俳優にメッセージを送信するとどうなりますか?メッセージはキューに入れられますか、それとも破棄されますか?

最も重要なもの:非常に高速に戻っても、作成したアクタに通知できる子アクターを作成するにはどうすればよいですか?

関連項目:現在のアクターインスタンス(this)を他のアクターに渡すことをお勧めしますか?何らかの理由で私はそれをやっている誰も見ていない。

+3

Scalaの俳優の質問を使用してみんなに、Akkaをチェックしてください。それは素晴らしい非常に高い集中力を持っています。 – leedm777

答えて

2

あなたは完璧です。アクタ内の未処理のメッセージは、単にメールボックスに入り、アクタが準備が整うと処理されます。ただし、発信者に返信する俳優に関しては、一般にthisへの参照を渡す必要はありません。俳優はreplyで発信者と直接通信できるためです。ここでは簡単な例です:私たちはそのメッセージに対する応答を得るまで

5 
15 
25 
35 
45 
55 
65 
75 
85 
95 
105 

!?オペレータで

class MyActor(n: Int) extends Actor { 
    def act() { 
    loop { 
     react { 
     case m: Int => reply(n + m) // Use `reply` to reply to caller 
     } 
    } 
    } 
} 

// new MyActor(0), new MyActor(10), new MyActor(20), ... 
val actors = (0 to 100 by 10) map (new MyActor(_).start()) 

// Message each actor with '5', expecting a response (that's what `!?` does) 
val responses = actors map (_ !? 5) 
responses foreach println 

結果は、しかし、メインスレッドをブロックします。その結果、actors map (_ !? 5)は、実際にはすべて同じではありません。代わりに!!を使用して先物を生成することができます(その間に計算を実行し、準備が整うまで評価を延期することができます)。だから... ...

val futures = actors map (_ !! 5) 
futures foreach (future => println(future())) 

意志その間に上に保持するために私に未来を与えて「5」とのメッセージ最初の俳優を、した後、「5」とのメッセージ第二の俳優をし、それらの最後の2行を変更し、その間に握る未来を与えて、準備が整ったら未来を評価して(印刷するような)何らかの形でその結果を使用することができます(future())。

1

アクターが開始されている間、それに送られたメッセージは、次のreceive/react呼び出しのためにキューに入れられます。

コンストラクタを介してアクターを渡すこともできますが、アクターの状態に直接アクセスする誘惑を取り除くために、派生タイプではなくアクターとして渡す必要があります。

通常、通常はアクタがメッセージに渡されるため、通常は表示されません。しかし、あなたがやっていることに何も間違っていることはありません。

関連する問題