Как запустить несколько экранных ниток nokogiri одновременно - PullRequest
5 голосов
/ 21 марта 2011

У меня есть сайт, который требует использования Nokogiri на разных сайтах для извлечения данных.Этот процесс запускается как фоновое задание с использованием гема delayed_job.Однако для запуска каждой страницы требуется около 3-4 секунд, поскольку приходится приостанавливать и ждать ответа других веб-сайтов.В настоящее время я просто запускаю их, говоря в основном:

Websites.all.each do |website|
  # screen scrape
end

Я хотел бы выполнять их партиями, а не по одному, чтобы мне не приходилось ждать ответа сервера с каждого сайта (может занять до 20время от времени).

Какой лучший способ сделать это с помощью рубинов или рельсов?

Заранее спасибо за помощь.

Ответы [ 3 ]

5 голосов
/ 21 марта 2011

Возможно, вы захотите проверить Typhoeus , который позволяет вам делать параллельные http-запросы.

Я нашел короткую заметку здесь об использовании ее с Nokogiri,но я не пробовал это сам.

Завернутый в диджея, это должно сработать с небольшой задержкой на стороне клиента.

2 голосов
/ 19 декабря 2011

Я использую EventMachine, чтобы сделать что-то подобное для текущего проекта.Существует потрясающий плагин em-http-request, который позволяет параллельно выполнять несколько HTTP-запросов, а также предоставляет возможности для синхронизации ответов.

Из документации по github em-http-request:

EventMachine.run {
  http1 = EventMachine::HttpRequest.new('http://google.com/').get
  http2 = EventMachine::HttpRequest.new('http://yahoo.com/').get

  http1.callback { }
  http2.callback { } 
end

Так что в вашем случае вы могли бы

callbacks = []
Websites.all.each do |website|
    callbacks << EventMachine::HttpRequest.new(website.url).get
end

callbacks.each do |http|
    http.callback { }
end

ЗапуститьПриложение rails с тонким веб-сервером, чтобы получить работающий цикл EventMachine:

bundle exec rails server thin

Вам также понадобятся гемы Eventmachine и em-http-request.Удачи!

2 голосов
/ 21 марта 2011

Вам нужно использовать отложенную работу. Проверьте это Railscasts .

Имейте в виду, что большинство хостов взимают плату за подобные вещи.

Вы также можете использовать плагин spawn , если вам не нужно управлять потоками, но это намного проще !!!

Это буквально все, что вам нужно сделать:

  1. rails plugin/install <a href="https://github.com/tra/spawn.git" rel="nofollow">https://github.com/tra/spawn.git</a>
  2. Затем в вашем контроллере или модели добавьте метод

Например:

 spawn do
    #execute your code here :)
 end 

http://railscasts.com/episodes/171-delayed-job

https://github.com/tra/spawn

...