2012-12-22 19 views
3

的問題是關於阿卡演員庫。 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) 

感謝您的幫助。

+5

你有沒有考慮使用Scala的並行集合此?沒有阿卡演員(明顯)參與其中,但後來它只是地圖和摺疊:http://docs.scala-lang.org/overviews/parallel-collections/overview.html –

回答

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完成並聯後,對於簡單的任務是確定,但一般你不應該等這麼久

2

兩件事情你可以做:

1)使用阿卡期貨。這些允許您以異步方式分派操作並摺疊它們。請查看http://doc.akka.io/docs/akka/2.0.4/scala/futures.html瞭解更多信息。

2)你可以派遣工作,以多個「工人」的演員,然後有了「主人」的演員聚集他們,跟蹤其中的消息待/通過存儲在消息本身的信息處理。我有這樣的使用阿卡演員在這裏簡單的股票報價例子:https://github.com/ryanlecompte/quotes

+0

+1期貨。鑑於你告訴我們的問題,未來看起來像是最簡單的解決方案。 – sourcedelica