【问题标题】:Ruby async whoisRuby 异步 whois
【发布时间】:2012-09-27 06:32:50
【问题描述】:

我使用whois 来执行和解析whois 查询。问题是:我需要做得更多。成千上万。我找到了异步包em-whois,这听起来很适合我。这是 whois 的简单插件,它依赖于 Ruby Fibersem-synchrony

我当前执行 whois 查询的代码如下所示:

...
c = Whois::Client.new(:timeout => timeout)
r = c.query(domain)
...

安装em-whois 后,我正在尝试扩展this basic example

我的代码现在看起来像这样,但仍然很慢:

$: << File.dirname(__FILE__) + '/../lib'
require 'em-whois'
EM.synchrony do  
  domain = ARGV[0] || "github.com"
  $i = 0;
  $num = 100;
  arr = Array.new($num)
  # perform all queries
  begin
     puts("Inside the loop i = #$i" );
     $i += 1;
     arr[$i] = Whois.whois(domain);
  end while $i < $num
  $i = 0;
  # get all results
  begin
     $i += 1;
    puts "\r#{domain}\n#{"-" * domain.length}"
    [:available?, :status, :expires_on].each do |k|
      puts "#{k}: #{arr[$i].properties[k]}"
    end
  end while $i < $num
  EM.stop
end

如何使用 whoisem-whois 的异步功能执行批量查询(1k 个域)?

我以前对 ruby​​ 没有任何经验。我是 Python/C/PHP 开发人员。请帮忙。

【问题讨论】:

  • 同时打开多个与 whois 服务器的连接似乎是永久阻止的好方法。
  • 我的问题更具理论性。我需要代码方面的帮助,我知道限制
  • 但是很可能服务器正在限制您,而您的代码很好。如果您分析代码,它是否会在 I/O 等待中占据大量时间?
  • 您需要的不仅仅是代码方面的帮助。这个概念是有缺陷的。

标签: ruby asynchronous eventmachine whois


【解决方案1】:

图书馆作者的回答。示例链接here

$: << File.dirname(__FILE__) + '/../lib'
require 'em-whois'
require 'atomic'

# Asynchronous, parallel multi-domain WHOIS lookup
domains = ARGV.empty? ? ["github.com", "google.com", "bing.com", "yahoo.com", "mikejarema.com"] : ARGV
whois   = {}

EM.synchrony do  

  # Progress indicator
  EM.add_periodic_timer(0.1) do
    STDERR.print "."
  end

  # Exit condition
  EM.add_periodic_timer(0.1) do
    if domains.size == whois.keys.size
      puts ""
      whois.each do |k,v|
        if v.properties[:available?]
          puts "#{k}: available"
        else
          puts "#{k}: taken, expires #{v.properties[:expires_on]}"
        end
      end

      EM.stop
    end
  end

  # Async WHOIS lookup - fire and forget via parallel fibers
  domains.each do |i|
    Fiber.new do
      whois[i] = Whois.whois(i)
    end.resume
  end

end

【讨论】:

  • 我是 em-whois 的作者并提供了上述代码,我想明确一点,我强烈反对未经授权的 WHOIS 数据收集。也就是说,上述解决方案有两个警告:1)它几乎同时触发所有 whois 查询,可以做进一步的工作来控制请求频率(例如 100/s)2)这个脚本快速达到 WHOIS 速率限制从单个 IP 运行时,跨 IP 代理是另一个考虑因素。
  • 第三个警告:3) 在生产用例中,应在“即发即弃”纤程中处理异常,否则可能永远无法满足退出条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2012-01-19
  • 2012-03-09
相关资源
最近更新 更多