【发布时间】:2013-02-10 05:21:31
【问题描述】:
我对此完全陌生,但这里有一个 Scala 演员,它是用我的班级创建的,只为其他演员生成消息。我希望它每秒都醒来,收集一些指标,将它们发送给其他参与者,然后重新入睡。终止应用程序时,我需要向该actor发送消息以退出
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 聪明吗?如果这是一个完整的线程,我现在有一个睡眠线程。如果这是一个事件,我现在是否阻止了一些事件处理队列?我可以使用接收/反应的东西更正确地做到这一点吗?我无法理解接收/反应是否有效地停止了演员的执行,这意味着我无法每秒醒来检查指标。下面的代码我也考虑过,不知道是不是比上面的代码更好!
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 Actors,但我建议查看 Akka (akka.io),它出于所有意图和目的已将 Scala Actors 替换为Scala 2.10 的。
-
我肯定正在研究它,但我的问题是寻找对如何使用 Actor 范例的理解,所以我认为切换实现在这一点上没有多大帮助。当然,我知道什么:-) 我仍然对 Akka 是否建立在 scala 演员之上有点困惑,他们的常见问题解答在“什么是 akka”问题上相当空白
-
不,akka 是一个完全独立的实现,远远超出了 scala 演员的能力。