我正在構建一個分佈式Web爬蟲,並試圖最大限度地利用每臺單機的資源。我通過Iterator在EventMachine中運行解析函數,並使用em-http-request發出異步HTTP請求。現在我有100次迭代同時運行,看起來我無法超越這個級別。如果我增加一些迭代次數,它不會影響抓取速度。然而,我只有10-15%的CPU負載和20-30%的網絡負載,所以有足夠的空間抓取更快。EventMachine:EM可以處理的並行HTTP請求的最大數量是多少?
我正在使用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
}