2

Ruby を使用してドメインの可用性を確認していますが、コードの実行速度が非常に遅くなります。リクエスト全体でWhoisオブジェクトをキャッシュするとパフォーマンスが向上しますが、SOに関する他の投稿では、パフォーマンスが向上したとしてもわずかにしか向上しないことが示唆されています.

コードはとてもシンプルです。他の改善が可能かどうか、それとも Whois オブジェクトのせいで検索が遅いだけなのかはわかりません。

bulk_checkメソッドは、検索するドメインの配列を受け入れます。他のすべては、かなり自明です。

Rails 3 を使用しています。

助言がありますか?

ありがとう!

def bulk_check
    domains = params[:domains] || '[]'
    callback = params[:callback] || ''      
    results = []
    threads = []

    # String -> Array
    domains = ActiveSupport::JSON.decode domains

    # Iterate over each domain and spawn new thread to check domain status
    domains.each do |d|
      threads << Thread.new(d) { |my_domain|
        Thread.current['domain'] = my_domain
        Thread.current['status'] = get_domain_status my_domain
      }
    end

    # Wait for threads to finish and update results array
    threads.each do |t| 
        t.join
        results.push [ t['domain'], t['status'] ]
    end

    # Render results
    respond_to do |type|
        type.json { render :json => { :results => results }.to_json, :callback => callback }
    end
end


def get_domain_status domain
    begin
        # Create Whois object
        whois = Whois::Client.new

        # Query Whois for domain data
        result = whois.query domain

        # Prep JSON response
        status = result.available? ? 'available' : 'taken'
    rescue Exception => e
        puts "Exception in parsing '#{domain}' status: #{e.message}"
        status = 'error'
    end

    # Return status
    return status
end
4

1 に答える 1

0

これは実際には CPU を集中的に使用する操作ではなく、「ネットワークを集中的に使用する」操作であるため、Ruby スレッドまたはファイバーを使用して複数のドメインを同時にチェックすることを検討してください。

たとえば、Celluloid gem を使用すると、簡単に操作できます: https://github.com/celluloid/celluloid/

于 2012-09-27T23:01:29.180 に答える