EventMachine:EM可以处理的并行HTTP请求的最大值是多少?

时间:2011-03-17 00:53:37

标签: ruby multithreading parallel-processing web-crawler eventmachine

我正在构建一个分布式网络爬虫,并试图从每台机器的资源中获取最大化。我通过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
}  

2 个答案:

答案 0 :(得分:3)

如果您使用 select()(这是EM的默认值),则最多为1024,因为select()限制为1024个文件描述符。

然而,您似乎正在使用 kqueue ,因此它应该能够同时处理超过1024个文件描述符。

答案 1 :(得分:0)

这是您的EM.threadpool_size的值?
尝试扩大它,我怀疑限制不是在kqueue中,而是在处理请求的池中...