Можно ли инициировать несколько параллельных http-запросов, используя EventMachine с Ruby 1.8? - PullRequest
3 голосов
/ 02 января 2011

em-synchrony.rb реализует эту функцию с Fibers, но я бы остановился на версии без Fibre с 1,8 МРТ.

EM.run do
  http = EM::Protocols::HttpClient2.connect("www.google.com", 80)
  request = http.get("/")
  request.callback do
    puts request.status
    EM.stop
  end
end

Ответы [ 2 ]

4 голосов
/ 02 января 2011

Если вы можете смотреть за пределы EventMachine, Typhoeus - это простой в использовании HTTP-клиент, который поставляется с Hydra, что дает возможность обрабатывать несколько запросов параллельно.

Я использовал его для пары вещей, и его легко настроить. Это некоторый непроверенный код, вырванный из того, что я написал на днях:

require 'typhoeus'

hydra = Typhoeus::Hydra.new(:max_concurrency => 10)
urls.each do |url|
  request = Typhoeus::Request.new(url)

  request.on_complete do |resp|
    filename = resp.request.url.split('/').last
    puts "writing #{filename}"
    File.open(filename, 'w') do |fo|
      fo.write resp.body
    end  
  end
  puts "queuing #{ url }"
  hydra.queue(request)
end

hydra.run
4 голосов
/ 02 января 2011

Посмотрите на em-http-request :

EM.run do
  http1 = EventMachine::HttpRequest.new('http://example.com/1').get
  http1.callback do
    p http1.response
  end
  http2 = EventMachine::HttpRequest.new('http://example.com/2').get
  http2.callback do
    p http2.response
  end
end
...