Создание нескольких Запросов HTTP асинхронно

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 после всех них сделан.

Что лучший способ сделать это? Подходит Волокно для этого?

11
задан 4 revs, 2 users 100% 6 September 2013 в 22:46
поделиться

4 ответа

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

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
15
ответ дан 3 December 2019 в 02:01
поделиться

Это зависит от того, что вы хотите сделать после функции после этого. Вы можете сделать это с простыми потоками:

см.: http://snipplr.com/view/3966/simple-example-of-threading-in-ruby/

0
ответ дан 3 December 2019 в 02:01
поделиться

Вы можете иметь разную тему выполнить каждый из Net :: http.get. И просто ждите всех потоков, чтобы закончить.

URL печати BTW будут печатать как ссылку, так и контент.

0
ответ дан 3 December 2019 в 02:01
поделиться

Это можно сделать с помощью библиотеки C cURL. Для этой библиотеки существует рубиновая привязка, но, похоже, она не поддерживает эту функциональность из коробки. Тем не менее, похоже, что есть патч, добавляющий/исправляющий его (пример кода доступен на странице). Я знаю, что это звучит не очень хорошо, но стоит попробовать, если нет предложений получше.

1
ответ дан 3 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: