EventMachine, Redis & EM HTTP-запрос - PullRequest
       21

EventMachine, Redis & EM HTTP-запрос

1 голос
/ 21 октября 2011

Я пытаюсь прочитать URL-адреса из магазина Redis и просто получить HTTP-статус URL-адресов.Все в рамках EventMachine.Я не знаю, что не так с моим кодом, но он не асинхронный, как ожидалось.

Все запросы выполняются от первого до последнего, и, что любопытно, я получаю только первый ответ (нужный мне заголовок 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

Я запускаю этот скрипт для нескольких тысяч доменов, поэтому я ожидаю получить первые ответы перед отправкой последнего запроса.

1 Ответ

2 голосов
/ 26 октября 2011

В то время как EventMachine является асинхронным, сам реактор является однопоточным. Итак, пока ваш цикл работает и запускает эти тысячи запросов, ни один из них не выполняется, пока цикл не завершится. Затем, если вы позвоните в EM.stop, вы остановите реактор, прежде чем он запустится.

Вы можете использовать что-то вроде EM :: iterator, чтобы разбить обработку доменов на куски, которые позволяют реактору работать. Тогда вам нужно будет немного поработать, если вы действительно хотите, чтобы EM.stop вел счетчик отправленных запросов и полученных ответов, прежде чем остановить реактор.

...