Параллельное выполнение процессов командной строки в Ruby - PullRequest
3 голосов
/ 25 июня 2011

Я использую PhantomJS, инструмент командной строки, для рендеринга изображений веб-сайтов, и я хочу запускать несколько из них параллельно вместо выполнения одного за другим. Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 25 июня 2011

Вот пример использования Resque . Заметьте, я для краткости оставил побег ... вы должны никогда передавать внешние входы непосредственно в команды оболочки.

class RasterizeWebPageJob
  @queue = :screenshots
  def self.perform(url)
    system("/usr/bin/env DISPLAY=:1 phantomjs rasterize.js #{url} ...")
  end
end

10.times { Resque.enqueue(RasterizeWebPageJob, "http://google.com/") }

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

Я бы посоветовал не использовать Thread.new в контроллере Rails. Очереди намного проще (и безопаснее) управлять, чем потоки.

1 голос
/ 25 июня 2011

Есть несколько способов сделать это. То, что вы ищете, это выполнять асинхронные задания в фоновом режиме. Это видео может помочь: http://railscasts.com/episodes/128-starling-and-workling

0 голосов
/ 11 июня 2013

Я думаю, что эти ответы могут отсутствовать - дать базовое образование по шаблону дизайна, который вы захотите использовать.Да, Resque или Starling и Workling или Resque в сочетании с Foreman будут отличными решениями, но вы, вероятно, захотите узнать, почему.

Я полагаю, что шаблон, который вы хотите использовать, - это шаблон Observer или Publisher-Абонент или PubSub, для краткости.Идея похожа на работу принтера в простейшем случае.

Человек (издатель) нажимает кнопку «Печать» в веб-браузере.Затем, асинхронно, принтер печатает их.Принтер, если он не включен, будет получать сообщения при включении.Если несколько человек отправляют документы на принтер, принтер выбирает их по порядку (FIFO), а затем обрабатывает (печатает).Если есть несколько принтеров, прослушивающих одну и ту же очередь (именно здесь метафора ломается, поскольку у вас ее обычно нет), они могут по очереди выбирать сообщения для более быстрой обработки очереди.

Resque и другиеВ шаблонах PubSub, проектах, JAR-файлах (вы не ограничены Ruby) реализован этот шаблон проектирования.

Дополнительная информация о шаблоне приведена здесь (обратите внимание, что Java Observable - это класс, который является плохим дизайнерским решением.реализовать свой собственный):

http://ruby -doc.org / stdlib-2.0 / libdoc / наблюдатель / rdoc / Observable.html http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html http://en.wikipedia.org/wiki/Observer_patternhttp://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern

Для нашей обработки мы используем Resque для небольших задач, но вы по-прежнему ограничены глобальной блокировкой интерпретатора и другими проблемами, такими как развертывание кода на сервере, установка гемов и т. Д. Теперь мыиспользуйте Storm (https://github.com/nathanmarz/storm) для обработки нашей потоковой обработки, и она работает намного лучше. Storm может быть излишним из-за того, что вы пытаетесь сделать, в зависимости от того, сколько изображений вы обрабатываете в день.

...