асинхронный HTTP-запрос в ruby - PullRequest
31 голосов
/ 11 июля 2011
 require 'net/http'

urls = [
  {'link' => 'http://www.google.com/'},
  {'link' => 'http://www.facebook.com/'},
 {'link' => 'http://www.yahoo.com/'}
]

urls.each do |u|
  u['content'] = Net::HTTP.get( URI.parse(u['link']) )
end

print urls

Это будет работать как процедурный код. Я просто хочу попасть на сервер, никаких проблем с заказом. Как я могу сделать это в рубине. Одним из вариантов является использование потоков.

Вот пример использования потоков.

require 'net/http'

urls = [
  {'link' => 'http://www.google.com/'},
  {'link' => 'http://www.facebook.com/'},
  {'link' => 'http://www.yahoo.com/'}
]

urls.each do |u|
  Thread.new do
    u['content'] = Net::HTTP.get( URI.parse(u['link']) )
    puts "Successfully requested #{u['link']}"

    if urls.all? {|u| u.has_key?("content") }
      puts "Fetched all urls!"
      exit
    end
  end
end

Любое лучшее решение .. ??

PS: - Я хочу нажать на Mixpanel, поэтому я просто хочу сделать http-вызов и не ждать ответа.

Ответы [ 3 ]

14 голосов
/ 11 июля 2011

Облегченная асинхронная обработка - это работа потоков (как вы сказали) или Волокна .

В противном случае вы должны рассмотреть EventMachine , который является очень мощным инструментом.

РЕДАКТИРОВАТЬ: вышеуказанный URL для Event Machine не работает. Вот их учетная запись GitHub, https://github.com/eventmachine/eventmachine. Это служит хорошей отправной точкой.

12 голосов
/ 11 июля 2011

Вот отличная статья , посвященная теме.

Как правило, жизнеспособными альтернативами для использования нитей для этого будет использование Fiber , или вы можете использовать эм-HTTP-запрос .В последнем примере вы можете опустить обработку обратного вызова для вашей конкретной цели.

2 голосов
/ 01 марта 2016

Если это просто обычные запросы HTTP в асинхронном стиле, вероятно, Unirest лучше всего подходит для его достижения.

Запрос Asnc так же прост:

response = Unirest.post "http://httpbin.org/post", 
                    headers:{ "Accept" => "application/json" }, 
                    parameters:{ :age => 23, :foo => "bar" } {|response|
response.code # Status code
response.headers # Response headers
response.body # Parsed body
response.raw_body # Unparsed body
}
...