我正在构建一个分布式网络爬虫,并试图从每台机器的资源中获取最大化。我通过Iterator在EventMachine中运行解析函数,并使用em-http-request来发出异步HTTP请求。现在我有100次迭代同时运行,似乎我无法通过这个级别。如果我增加一些迭代次数,它不会影响爬行速度。但是,我只获得10-15%的CPU负载和20-30%的网络负载,因此有足够的空间来快速爬行。
我正在使用Ruby 1.9.2。有没有办法改进代码以有效地使用资源,或者我甚至做错了?
def start_job_crawl
@redis.lpop @queue do |link|
if link.nil?
EventMachine::add_timer( 1 ){ start_job_crawl() }
else
#parsing link, using asynchronous http request,
#doing something with the content
parse(link)
end
end
end
#main reactor loop
EM.run {
EM.kqueue
@redis = EM::Protocols::Redis.connect(:host => "127.0.0.1")
@redis.errback do |code|
puts "Redis error: #{code}"
end
#100 parallel 'threads'. Want to increase this
EM::Iterator.new(0..99, 100).each do |num, iter|
start_job_crawl()
end
}
答案 0 :(得分:3)
如果您使用 select()(这是EM的默认值),则最多为1024,因为select()限制为1024个文件描述符。
然而,您似乎正在使用 kqueue ,因此它应该能够同时处理超过1024个文件描述符。
答案 1 :(得分:0)
这是您的EM.threadpool_size的值?
尝试扩大它,我怀疑限制不是在kqueue中,而是在处理请求的池中...