асинхронный http-запрос в ruby

 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

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

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

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 ответов


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

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


здесь большая статья на эту тему.

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


если его только о простых HTTP-запросах в асинхронном стиле, вероятно,Унирест лучше всего подходит для его достижения.

запрос 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
}