0
我是比較新的斯卡拉演員。我有巨大的地圖,它被分成更小的塊並通過演員執行。根據地圖大小,創建的演員人數會有所不同。演員工作良好,過程完成。但是如何檢查生成的演員的狀態?在Java中,我熟悉使用線程池執行器服務。在斯卡拉如何做到這一點?如何從主進程中檢查scala actors的狀態?
我是比較新的斯卡拉演員。我有巨大的地圖,它被分成更小的塊並通過演員執行。根據地圖大小,創建的演員人數會有所不同。演員工作良好,過程完成。但是如何檢查生成的演員的狀態?在Java中,我熟悉使用線程池執行器服務。在斯卡拉如何做到這一點?如何從主進程中檢查scala actors的狀態?
有多種方法可以做到你想要什麼:
有工人演員消息發送回給發送者通知它的操作來完成。每個actor都有一個對sender sender(發送消息的actor)的引用,您可以使用它來發送完成消息。發件人然後可以處理該消息。
而是經由tell
(例如actor ! msg
)發送消息的,則使用ask
,它返回一個Future
。您可以在完成後運行的Future上設置回調。
如果工人演員爲一次性操作啓動,請在操作完成後通過停止它自行終止。父角色(創建工人角色的那個角色)可以通過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
}
}
}
你如何稱呼ParentActor?如果ParentActor被調用兩次會怎麼樣? – kenlz