【发布时间】:2015-08-16 19:51:52
【问题描述】:
我有 2 个用于爬取链接的 akka 演员,即找到页面 X 中的所有链接,然后找到从 X 链接的所有页面中的所有链接,等等......
我希望他们或多或少地以相同的速度进步,但往往他们中的一个会挨饿,而另一个会消耗所有资源。
我尝试了以下方法(简化)。 单页抓取由以下参与者完成:
class Crawler extends Actor {
def receive = {
case Crawl(url, kind) =>
// download url
// extract links
sender ! Parsed(url, links, kind)
}
}
方法一:
class Coordinator extends Actor {
val linksA = ...
val linksB = ...
def receive = {
case Parsed(url, links, kind) =>
val store = if (kind == kindA) linksA else linksB
val newLinks = links -- store
store ++= links
newLinks.foreach { link =>
val crawler = context.actorOf(Props[Crawler])
crawler ! Crawl(link, kind)
}
}
}
方法2:
class Coordinator extends Actor {
val linksA = ...
val linksB = ...
val rrProps = Props[Crawler].withRouter(RoundRobinRouter(nrOfInstances = 10)
val crawlerA = context.actorOf(rrProps)
val crawlerB = context.actorOf(rrProps)
def receive = {
case Parsed(url, links, kind) =>
val store = if (kind == kindA) linksA else linksB
val newLinks = links -- store
store ++= links
newLinks.foreach { link =>
if (kind == kindA) crawlerA ! Crawl(link, kind)
else crawlerB ! Crawl(link, kind)
}
}
}
第二种方法使事情稍微好一些,但并没有完全解决。
有没有一种好方法可以让两种爬虫或多或少地以相同的速度前进?我是否应该在它们之间发送消息以依次解除阻塞?
【问题讨论】:
标签: multithreading scala web-crawler akka actor