асинхронный 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
}