如何重新设计此顺序网络程序以获得更好的性能?

时间:2011-12-08 20:36:38

标签: c ruby concurrency web

我写了一个Ruby脚本,它接收一个URL文件,检查该URL网页上是否存在指向网站的链接(指定为命令行参数),如果链接未标记'nofollow',它将URL打印到STDOUT。该计划的目的是过滤掉链接到指定网站但不传递链接汁的网站。

它工作正常,但脚本需要数小时才能检查~3000个网页。我想改进这个,主要是为了好玩,并学习一些解决此类问题的技术。我的主要目标是以一种能够使网络连接饱和的方式重写程序,因为网络I / O是当前的瓶颈。

现在,我不知道解决这个问题的最佳方法是什么。我知道以事件驱动的方式构造程序通常用于编写有效的网络代码,而替代方案似乎是使用线程。但是,我的(不正确的)理解是,Ruby并不真正支持并发编程,因为Ruby运行时使用了全局锁。

我现在也知道C,但是,如果有其他语言特别适合这种事情(特别是在大规模上,想想数百万个URL而不是数千个),我可以花一些时间来学习这种语言因为我计划将来建立一些类似的计划。适合工作的正确工具以及所有这些。

所以,我的问题大致是:

  • Ruby或C是否适合以有效的方式解决这个问题?
  • 我如何构建这样的程序?我应该使用哪些库?

如果Ruby和C都不合适:

  • 哪种语言适合此类程序?
  • 我如何构建这样的程序?我应该使用哪些库?

以下是我的剧本现在的样子:

(argument parsing code omitted)

def dofollow?(link)
  if not link.attr("rel").nil?
    if link.attr("rel").include?("nofollow")
      return false
    end
  end
  return true
end

options = parse(ARGV)

File.open(options.file, "r") do |file|
 file.each do |website|
    begin
      doc = Nokogiri::HTML(open(website))
      doc.css("a").each do |link|
        if link.attr("href").include?(options.url) && dofollow?(link)
          puts website
          break
        end
      end
    rescue
    end
  end
end

1 个答案:

答案 0 :(得分:0)

您可能需要考虑像Typhoeus这样的并行http库。它是一个ruby API,但它使用lib绑定的C绑定来快速并行获取。

另一个优秀的库是em-http-request,它在并行请求的eventmachine事件框架上运行。