require 'net/http'
urls = [
{'link' => 'http://www.google.com/'},
{'link' => 'http://www.yandex.ru/'},
{'link' => 'http://www.baidu.com/'}
]
urls.each do |u|
u['content'] = Net::HTTP.get( URI.parse(u['link']) )
end
print urls
Этот код работает в синхронном стиле. Первый запрос, во-вторых, треть. Я хотел бы отправить все запросы асинхронно и печать urls
после всех них сделан.
Что лучший способ сделать это? Подходит Волокно для этого?
Вот пример использования потоков.
require 'net/http'
urls = [
{'link' => 'http://www.google.com/'},
{'link' => 'http://www.yandex.ru/'},
{'link' => 'http://www.baidu.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
sleep
Это зависит от того, что вы хотите сделать после функции после этого. Вы можете сделать это с простыми потоками:
см.: http://snipplr.com/view/3966/simple-example-of-threading-in-ruby/
Вы можете иметь разную тему выполнить каждый из Net :: http.get. И просто ждите всех потоков, чтобы закончить.
URL печати BTW будут печатать как ссылку, так и контент.
Это можно сделать с помощью библиотеки C cURL. Для этой библиотеки существует рубиновая привязка, но, похоже, она не поддерживает эту функциональность из коробки. Тем не менее, похоже, что есть патч, добавляющий/исправляющий его (пример кода доступен на странице). Я знаю, что это звучит не очень хорошо, но стоит попробовать, если нет предложений получше.