2013-05-19 49 views
2

我想使用Akka框架併發地寫入多個文件,首先我創建了一個名爲MyWriter的類寫入文件,然後使用期貨我稱這個對象兩次跳轉2文件將爲我創建,但是當我監視程序的執行時,它首先填充第一個文件,然後填充第二個文件(阻塞/同步)。如何使用期貨與Akka的異步結果

問:我怎樣才能使代碼波紋管運行(無粘連/異步)

import akka.actor._ 
import akka.dispatch._ 
import akka.pattern.ask 
import akka.util.Timeout 

import scala.concurrent.Await 
import scala.concurrent.duration._ 
import scala.concurrent.Future 
import scala.concurrent.{ ExecutionContext, Promise } 
import ExecutionContext.Implicits.global 

class my_controler { 

} 

object Main extends App { 

    val system = ActorSystem("HelloSystem") 
    val myobj = system.actorOf(Props(new MyWriter), name = "myobj") 
    implicit val timeout = Timeout(50 seconds) 
    val future2 = Future { myobj ! save("lots of conentet") } 
    val future1 = Future { myobj ! save("event more lots of conentet") } 

} 

的MyWriter代碼:

case class save(startval: String) 

class MyWriter extends Actor { 
    def receive = { 
    case save(startval) => save_to_file(startval) 
    } 

爲什麼代碼不同時執行什麼想法嗎?

+0

如何定義'save'? –

+0

好吧,讓我編輯我的問題,添加 – CruncherBigData

+4

請記住,硬盤不喜歡並行訪問。他們放慢速度 - 很多。所以如果它們在同一個hd上,不要並行地寫文件。還有其他人已經提到過,不要在未來包裝與演員的溝通。 – SpiderPig

回答

4

你爲什麼要用?打電話給另外Future? Ask(?)無論如何返回Future,所以你在這裏做的是圍繞另一個Future包裹Future,我不是你想要做的surte。

我看到的第二個問題是您要發送兩條消息給同一個actor實例,並且您期望它們並行運行。演員實例串行處理其郵箱。如果你想同時處理,那麼你將需要你的兩個角色實例。如果這就是你想要做的,那麼只需啓動FileWriter的另一個實例併發送第二條消息。

+0

你是絕對正確的,我正在實例化相同的對象,現在我創建了兩個不同的對象,它並行工作。非常感謝。 – CruncherBigData

+0

還有一個問題,如果我想開始說100個fileWriter實例,那麼最佳做法是什麼? – CruncherBigData

+2

對於這種情況,我建議使用池式路由器,然後使用循環法或最小郵箱策略。讓演員長久居住,坐在路由器後面,將消息分發給他們。查看關於路由器的文檔,瞭解如何使其工作,但從創建點看,它看起來像這樣:'system.actorOf(Props [MyWriter] .withRouter(RoundRobinRouter(100)),「filewriter」)' 。文檔:http://doc.akka.io/docs/akka/2.1.4/scala/routing.html – cmbaxter