Await.receive
は、Scalaの並行処理APIの一部であり、役者とは何の関係もありません。その目的は、提供された未来が完了するまで、またはタイムアウト制限が発生し、タイムアウト例外ですべてが終了するまで、現在のスレッドをブロックすることです。
オペレータ?
が実際の俳優からの応答を待っているの唯一の目的で、一時的な俳優を作成します頼むはaref
変数によって指さ、あなたが受信した応答でお願いオペレータを呼び出したときにあなたが得た未来を完了します。
あなたのコードは基本的にスレッド全体をブロックしています。指示されているように、現在のスレッドを解放し、他の作業を続行したい場合は、コールバックを将来に追加することができます。
implicit val ctx: ExecutionContext = //provide execution context here
implicit val timeout: Timeout = // provide timeout here
aref ? GroupReceive(fromRank)) onSuccess { res =>
//do something with res here, asynchronously
}
// some other code which runs without being blocked...
上記のコードでは、前述した俳優のDSLを書き換えることができます。後者のバージョンはまた後に、GroupReceive
メッセージを送信し、応答を待ち、新しい一時的な俳優を作成
import akka.actor.ActorDSL._
implicit val actorSystem: ActorSystem = // provide an actor system here or any actor ref factory
actor(new Act {
aref ! GroupReceive(fromRank)
context.setReceiveTimeout(timeout) //optional
become {
case ReceiveTimeout => {
//handle the timeout
context.stop(self)
}
case res => {
//do your thing with res, asynchronously
context.stop(self)
}
}
}
//some other code which won't wait for the above operations
それはそれ自身を殺す。
結論は、俳優からメッセージを受け取るためには、俳優でなければなりません。俳優はただActorRef
以外にメッセージを送ることはできません。
したがって、舞台裏で一時的な俳優を作成し、この一時的な俳優のライフサイクル自体を管理する尋問パターンを使用するか、作業する素敵な簡単な未来を暴露するか、または一時的な俳優を自分で作成することができますあなたはそのライフサイクルを管理しなければなりません(つまり、仕事を終えたらそれを忘れないようにしてください)
あなたに最適なオプションを選択してください。
akkaでは、 'asInstanceOf'の代わりに' mapTo [Type] 'をよく使うべきです。 – 4lex1v
どのような利点がありますか? :) – Felix
'asInstanceOf'は、失敗したときに例外をスローします。 'mapTo'は失敗した未来を返します。 – drexin