1

whoisを使用して、whois クエリを実行および解析しています。問題は、もっと多くのことを実行する必要があることです。何千も何千も。非同期パッケージem-whoisを見つけました。これは私にとって完璧に思えます。これは、 Ruby ファイバーem-synchronyに依存するwhoisの単純なアドオンです。

whois クエリを実行する現在のコードは次のようになります。

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

em-whoisをインストールした後、この基本的な例を拡張しようとしています。

私のコードは次のようになりましたが、それでも非常に遅いです:

$: << 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 のドメイン) を実行するにはどうすればよいですか?

私は以前にルビーの経験がありません。私は Python/C/PHP 開発者です。助けてください。

4

1 に答える 1

2

ライブラリの作者からの回答。ここにリンクされた例。

$: << 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
于 2012-09-27T20:51:52.923 に答える