【发布时间】:2012-01-11 04:37:33
【问题描述】:
我正在生成少量参与者来获取、处理 RSS 提要项目并将其保存到数据库中。这是通过在 cron 上运行的对象的 main 方法完成的。我创建这些演员并在他们完成分配给他们的先前工作时分配工作给他们。我的主要课程产生了一个演员,将工作分配给一群演员。最终,主要方法似乎挂起。它没有退出,但所有演员的执行都停止了。我的 CTO 认为主角在演员完成他们的工作并离开他们之前就退出了,但我不相信是这样的。我在 main 上没有收到成功退出(根本没有退出)。
基本上我想知道如何调试这些演员,以及什么可能的原因会导致这种情况发生。在演员完成执行之前主退出(如果确实如此,那有关系吗?)据我所知,使用接收的演员被一对一映射到线程,对吗?代码如下。请提出任何后续问题,非常感谢您的帮助。我知道我可能没有提供足够的细节,我是 scala 和演员的新手,会根据需要更新。
object ActorTester {
val poolSize = 10
var pendingQueue :Set[RssFeed] = RssFeed.pendingQueue
def main(args :Array[String]) {
val manager = new SpinnerManager(poolSize, pendingQueue)
manager.start
}
}
case object Stop
class SpinnerManager(poolSize :Int = 1, var pendingQueue :Set[RssFeed]) extends Actor {
val pool = new Array[Spinner](poolSize)
override def start() :Actor = {
for (i <- 0 to (poolSize - 1)) {
val spinner = new Spinner(i)
spinner.start()
pool(i) = spinner
}
super.start
}
def act() {
for {
s <- pool
if (!pendingQueue.isEmpty)
} {
s ! pendingQueue.head
pendingQueue = pendingQueue.tail
}
while(true) {
receive {
case id :Int => {
if (!pendingQueue.isEmpty) {
pool(id) ! pendingQueue.head
pendingQueue = pendingQueue.tail
} else if ((true /: pool) { (done, s) => {
if (s.getState != Actor.State.Runnable) {
val exited = future {
s ! Stop
done && true
}
exited()
} else {
done && false
}
}}) {
exit
}
}
}
}
}
}
class Spinner(id :Int) extends Actor {
def act() {
while(true) {
receive {
case dbFeed :RssFeed => {
//process rss feed
//this has multiple network requests, to the original blogs, bing image api
//our instance of solr - some of these spawn their own actors
sender ! id
}
case Stop => exit
}
}
}
}
【问题讨论】:
标签: scala concurrency jvm actor