3

質問は、Akka俳優ライブラリについてです。1つの大きなタスクを小さなタスクに分割し、それらの結果を1つの「大きな」結果に折りたたむ必要があります。これにより、計算の利益が速くなります。小さなタスクは、独立している場合、並行して計算できます。

このような何かを計算する必要があると仮定します。関数count2Xは時間がかかるため、1つのスレッドで数回使用するのは最適ではありません。

//NOT OPTIMAL
def count2X(x: Int) = {
  Thread.sleep(1000)
  x * 2
}

val sum = count2X(1) + count2X(2) + count2X(3)
println(sum)

そして、ここに質問があります。

すべてakkaアクターを使用して、タスクをディスパッチして結果を収集し、それらをフォールドする方法は? そのような機能はすでにAkkaによって提供されていますか、それとも自分で実装する必要がありますか?そのようなアプローチの最良の実践は何ですか。

これが私の質問の「視覚的な」解釈です:

             /-> [SMALL_TASK_1] -\
[BIG_TASK] -+--> [SMALL_TASK_1] --> [RESULT_FOLD]
             \-> [SMALL_TASK_1] -/

以下は、実装が欠落している/悪い実装である私の足場の実装です:)

case class Count2X(x: Int)

class Count2XActor extends Actor {
  def receive = {
    case Count2X(x) => count2X(x); // AND NOW WHAT ?
  }
}

case class CountSumOf2X(a: Int, b: Int, c: Int)

class SumOf2XActor extends Actor {
  val aCounter = context.actorOf(Props[Count2XActor])
  val bCounter = context.actorOf(Props[Count2XActor])
  val cCounter = context.actorOf(Props[Count2XActor])

  def receive = {
    case CountSumOf2X(a, b, c) => // AND NOW WHAT ? aCounter ! Count2X(a); bCounter ! Count2X(b); cCounter ! Count2X(c);
  }
}

val aSystem = ActorSystem("mySystem")
val actor = aSystem.actorOf(Props[SumOf2XActor])

actor ! CountSumOf2X(10, 20, 30)

助けてくれてありがとう。

4

2 に答える 2

2

あなたができる2つのこと:

1)Akka先物を使用します。これらを使用すると、操作をディスパッチして、非同期的に折りたたむことができます。詳細については、 http://doc.akka.io/docs/akka/2.0.4/scala/futures.htmlを確認してください。

2)複数の「ワーカー」アクターに作業をディスパッチしてから、「マスター」アクターにそれらを集約させ、メッセージ自体に情報を格納することで、保留中/処理中のメッセージを追跡できます。ここにAkkaアクターを使用した簡単な株価の例があります:https ://github.com/ryanlecompte/quotes

于 2012-12-22T19:13:34.367 に答える
2

アッカでは、私はこのようなことをします:

val a = aCounter ? Count2X(10) mapTo[Int]
val b = bCounter ? Count2X(10) mapTo[Int]
val c = cCounter ? Count2X(10) mapTo[Int]
Await.result(Future.sequence(a, b, c) map (_.sum), 1 second).asInstanceOf[Int]

より良い方法があると確信しています-ここでは、すべてのFuture-sが並行して完了した後で結果の合計を開始します。単純なタスクの場合は問題ありませんが、通常はそれほど長く待つ必要はありません。

于 2012-12-24T00:49:21.437 に答える