12

自分のスレッドから Akka アクターとやり取りしたいです。現在、私はそうしています:

val res = Await.result(aref ? GroupReceive(fromRank), timeout.duration).asInstanceOf[T]

しかし、これが実際に私のスレッドとどのように相互作用するのかわかりませんか? 受信が非同期であることを望みます。つまり、受信中にスレッドをハングアップして、他の作業を実行できるようにしたいと考えています。最近、Akka インボックス システムについて読みました。インボックス akka api

Await は毎回新しいアクターを作成することを思い出すと思います。await+ask と inbox の違いは何ですか? また、inbox を作成し、それを使用して「外部」からアクターと通信する方法の例を教えてもらえますか?

編集明確にするために、同じスレッドが引き続き動作することを望んで いません。CPUコアの占有を停止し、何かを受信するまで他のスレッドを動作させたままにしてから、再び起動します。

4

3 に答える 3

9

Akka の Future ドキュメントに書かれているように、Await を使用すると、結果を待つまで現在のスレッドがブロックされます。

import scala.concurrent.Await
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._

implicit val timeout = Timeout(5 seconds)
val future = actor ? msg // enabled by the “ask” import
val result = Await.result(future, timeout.duration).asInstanceOf[String]

これにより、現在のスレッドがブロックされ、Actor が応答で Future を「完了する」まで待機します。

アクターで使用

于 2013-05-24T09:17:55.003 に答える
0

呼び出し側でブロックしたくない場合は、Await を使用しないでください。代わりに、onSuccess、onFailure、onComplete などの非ブロッキング コールバックを使用してください。これを行うと、将来のタスクは、ask (?) の時点でスコープ内にある ExecutionContext に入れられます。応答が受信されると、このコールバックは ExecutionContext を介して非同期的に呼び出されます。このようにして、アクターにリクエストを送信しているスレッドですべてがブロックされるのを回避し、コールバックは ExecutionContext に関連付けられたスレッド プールで処理されます。

さらに、あなたが言及した受信トレイのものは、REPL でアクターのものをテストすることを目的としていると思います (少なくとも ActorDsl のドキュメントにはそう記載されています)。アクターの外部から ask を使用するアプローチに固執します。非アクターからアクターへの呼び出しの内部での通信に必要な短命のアクターを akka に作成させます。次に、上で提案したように、非ブロッキング コールバックに切り替えます。私はそれがあなたが探しているものだと信じています。

于 2013-05-24T10:58:38.143 に答える