2014-01-18 39 views
0

我是比較新的斯卡拉演員。我有巨大的地圖,它被分成更小的塊並通過演員執行。根據地圖大小,創建的演員人數會有所不同。演員工作良好,過程完成。但是如何檢查生成的演員的狀態?在Java中,我熟悉使用線程池執行器服務。在斯卡拉如何做到這一點?如何從主進程中檢查scala actors的狀態?

回答

4

有多種方法可以做到你想要什麼:

  1. 有工人演員消息發送回給發送者通知它的操作來完成。每個actor都有一個對sender sender(發送消息的actor)的引用,您可以使用它來發送完成消息。發件人然後可以處理該消息。

  2. 而是經由tell(例如actor ! msg)發送消息的,則使用ask,它返回一個Future。您可以在完成後運行的Future上設置回調。

  3. 如果工人演員爲一次性操作啓動,請在操作完成後通過停止它自行終止。父角色(創建工人角色的那個角色)可以通過DeathWatch機制監視該工作者,該機制在子角色終止時通知父母。在這種方法中,終止意味着操作已經完成。但是,您需要跟蹤父母接收的終止次數,以確定所有工作人員何時完成。

使用哪種方法取決於您的使用情況和操作的性質。最常見和靈活的方法是#1。示例(未測試):

case class PerformWork(i: Int) 
case object WorkDone 

class ParentActor(size: Int) extends Actor { 

    for (i <- 1 to size) { 
    val actor = context.actorOf(Props[Worker], s"worker$i") 
    actor ! PerformWork(i) 
    } 

    var result = 0 

    def receive = { 
    case WorkDone => { 
     result += 1 

     if (result == size) { 
     // work is done 
     } 
    } 
    } 
} 

class Worker extends Actor { 
    def receive = { 
    case m: PerformWork => { 
     // do some work 
     // ... 

     sender ! WorkDone 
    } 
    } 
} 
+0

你如何稱呼ParentActor?如果ParentActor被調用兩次會怎麼樣? – kenlz