2011-10-21 8 views
1

私はRedisストアからURLを読み込み、URLのHTTPステータスを取得するだけです。すべてEventMachine内にあります。自分のコードに何が問題なのか分かりませんが、期待通りに非同期ではありません。EventMachine、Redis&EM HTTPリクエスト

すべてのリクエストは最初のリクエストから最後のリクエストまで実行され、不思議なことに、最後のリクエスト後に最初のレスポンス(チェックしたいHTTPヘッダ)のみを取得します。誰がそこに何が間違っているのヒントを持っていますか?

require 'eventmachine' 
require 'em-hiredis' 
require 'em-http' 

EM.run do 
    @redis = EM::Hiredis.connect 
    @redis.errback do |code| 
    puts "Error code: #{code}" 
    end 

    @redis.keys("domain:*") do |domains| 
    domains.each do |domain| 
     if domain 
     http = EM::HttpRequest.new("http://www.#{domain}", :connect_timeout => 1).get 
     http.callback do 
      puts http.response_header.http_status 
     end 
     else 
     EM.stop 
     end 
    end 
    end 
end 

私は最後の要求を送信する前に最初の回答を得ることを期待するので、私は、数千のドメインに対してこのスクリプトを実行していますよ。

+0

キー配列を.eachで繰り返し処理していますか?イベントマシンの方法でそれをどのように処理するのですか? – ctp

答えて

2

EventMachineは非同期ですが、リアクタ自体はシングルスレッドです。したがって、ループが実行されている間に何千ものリクエストが発生すると、ループが終了するまでそれらのどれも実行されません。 EM.stopを呼び出すと、実行する前に原子炉を停止します。

EM :: iteratorのようなものを使用して、ドメインの処理をチャンクに分割してリアクタを実行させることができます。その後、原子炉を停止する前に、派遣された要求のカウンターと受け取った応答を保持することによって、EM.stopに本当に欲しい場合は、いくつかの魔法を実行する必要があります。

+0

ちょっとdj2、あなたのきれいな説明のために多くのありがとう。私はEMについてのすべての事実を理解するために良い文書を紛失しています。たくさんの新しいものを学ぶ;-) – ctp

+0

あなたの問題を修正しましたか? – dj2

関連する問題