gpt4 book ai didi

c - 如何修改这个顺序网络程序以获得更好的性能?

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:48 25 4
gpt4 key购买 nike

我写了一个小的 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

最佳答案

您可能需要考虑像 Typhoeus 这样的并行 http 库.这是一个 ruby​​ API,但它使用 C 绑定(bind)到 libcurl 以实现快速并行提取。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com