Я создаю распределенный веб-сканер и пытаюсь максимально использовать ресурсы каждой отдельной машины. Я запускаю функции синтаксического анализа в EventMachine через Iterator и использую em-http-request для выполнения асинхронных HTTP-запросов. На данный момент у меня есть 100 итераций, которые выполняются одновременно, и кажется, что я не могу пройти этот уровень. Если я увеличу количество итераций, это не повлияет на скорость сканирования. Тем не менее, я получаю только 10-15% загрузки процессора и 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
}