我完全不熟悉這一點,但這裏是一個Scala演員,它是用我的課程創建的,只能爲其他演員生成消息。我希望它每秒醒來,收集一些指標,將它們運送給其他演員,然後再回去睡覺。當終止應用程序,我需要發送此演員一條消息,以退出正確的方法來終止Scala演員只生成消息
class Node() {
println("A new Node is being constructed")
val load_monitor: Actor = actor {
val s: Sigar = new Sigar
while (true) {
Thread.sleep(1000);
// Will be replaced with something like
// load_manager | s.getCpuSystem
println(s.getCpuPerc)
self.receiveWithin(100) {
case "EXIT" => exit()
case TIMEOUT => {}
}
}
}
// Other Node code below...
}
這似乎工作,但我沒有信心它是正確的。調用Thread.sleep是否聰明?如果這是一個完整的線程,我現在有一個睡眠線程。如果這是一個事件,我現在是否阻止了一些事件處理隊列?我可以使用接收/反應的東西來更正確地做到這一點嗎?我無法理解接收/反應是否有效地阻止了actor的執行,這意味着我無法每秒醒來檢查指標。我也考慮過下面的代碼,但我不知道它是否比上面的代碼更好!
class Node() {
println("A new Node is being constructed")
val load_monitor: Actor = actor {
val s: Sigar = new Sigar
while (true) {
self.receiveWithin(1000) {
case "EXIT" => exit()
// Will be replaced with something like
// load_manager | s.getCpuSystem
case TIMEOUT => println(s.getCpuPerc)
}
}
}
// Other Node code below...
}
我不確定這個答案,因爲我對Scala Actor不熟悉,但是我建議查看Akka(http://akka.io/),對於所有的意圖和目的,都將Scala Actors替換爲斯卡拉2.10。 – adelbertc 2013-02-10 05:43:28
我一定在研究它,但我的問題在於尋找對如何使用Actor範例的理解,所以我不認爲切換實現在這一點上會有很大的幫助。誠然,我知道什麼:-)如果Akka建立在scala演員之上,我仍然有點困惑,他們的常見問題在「什麼是akka」問題上很空白 – Hamy 2013-02-10 05:53:13
不,akka是一個完全獨立的實現,超出了斯卡拉演員的能力。 – drexin 2013-02-10 08:12:50