質問は、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)
助けてくれてありがとう。