我已经写了一个小Ruby脚本,它需要一个URL文件,检查是否存在一个链接到网站(指定为命令行参数)在该URL的网页上,如果该链接没有标记为“”,它会将URL打印到。该程序的目的是过滤掉链接到指定网站但不传递链接果汁的网站。
它工作正常,不过,脚本需要几个小时来检查~3000个网页。我想提高这一点,主要是为了好玩,并学习一些技巧,以解决这类问题在未来。我的主要目标是重写程序,使其能够饱和网络连接,因为网络I/O是当前的瓶颈。
现在,我不知道解决这个问题的最好方法是什么。我知道以事件驱动的方式构造程序通常用于编写高效的网络代码,而另一种方法似乎是使用线程。是我的(不正确?)不过,要理解Ruby并不真正支持并发编程,因为Ruby运行时使用全局锁。
我现在也知道C语言,但是,如果有其他语言特别适合这类事情(特别是在大规模的情况下,认为数百万的网址而不是数千),我可以花一些时间来学习这种语言,因为我计划在未来建立一些类似的程序。适合这项工作的工具。
所以,我的问题大致是:
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

最佳答案

您可能需要考虑一个类似Typhoeus的并行http库。它是一个ruby API,但它使用libcurl的C绑定来实现快速并行获取。
另一个优秀的库是em-http-request,它在eventmachine事件框架上为并行请求运行。

关于c - 如何重做此顺序网络程序以获得更好的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8437350/

10-11 22:58
查看更多