的問題是關於阿卡演員庫。 A想將一項大任務分成更小的任務,然後將其結果摺疊成一個「大」結果。這會給我更快的計算利潤。較小的任務可以並行計算,如果它們是獨立的。阿卡拆分任務分成更小和摺疊結果
假設我們需要計算somethig這樣。函數count2X
非常耗時,因此在一個線程中多次使用它並不是最佳選擇。
//NOT OPTIMAL
def count2X(x: Int) = {
Thread.sleep(1000)
x * 2
}
val sum = count2X(1) + count2X(2) + count2X(3)
println(sum)
這裏就是問題所在。
如何分派任務和收集結果,然後,全部採用阿卡演員摺疊他們? 這樣的功能是否已經由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)
感謝您的幫助。
你有沒有考慮使用Scala的並行集合此?沒有阿卡演員(明顯)參與其中,但後來它只是地圖和摺疊:http://docs.scala-lang.org/overviews/parallel-collections/overview.html –