Запуск приложений через ruby ​​и многоядерную поддержку? (MacOS) - PullRequest
4 голосов
/ 20 марта 2010

Я ищу несколько учебных пособий / ресурсов / советов, которые покажут мне, как запускать приложения через скрипт ruby. У меня есть несколько небольших инструментов, которые мы используем в наших повседневных операциях, и я хочу управлять их задачами одним скриптом ruby.

В основном я пытаюсь сделать следующее:

  1. запустить приложение через скрипт ruby.
  2. (ожидание результата) получить код результата (сообщение об ошибке или сообщение об ошибке)
  3. если все в порядке, запустите приложение для следующей задачи.

Кроме того, каждая из этих задач является независимой, поэтому я хотел бы воспользоваться преимуществами 8 ядер на моем MacPro и запускать 8 экземпляров одновременно.

Ответы [ 2 ]

2 голосов
/ 20 марта 2010

Первый: используйте MacRuby. В последнем MacRuby есть встроенная диспетчеризация Grand Central - это прямота Snow Leopard, которая автоматически управляет многопоточными потоками и т. Д. Вам может и не понадобиться все это, но если вы знаете , это будет работать только на Mac, почему нет?

Второе: возьмите 1,9 издание книги по кирке (это Программирование на Ruby 1.9 ) и прочитайте всю главу о потоках, волокнах и процессах.

Третье: адаптировать то, что вы изучаете, к вашим собственным потребностям, но я, вероятно, подхожу к этой проблеме, выделив новый Thread для каждой задачи, а затем выполнив вызов system или `backtick` для каждой утилиты в пределах ее собственный поток. В Ruby 1.9 есть реальные потоки (а в MacRuby есть лучшие), поэтому все они действительно будут работать одновременно - и блокировка интерпретатора вообще не имеет значения, если вы в основном ожидаете внешних процессов.

(Если бы вам не нужно было обращать внимание на результаты вызовов и не нужно было зацикливаться, пример exec('foo') if fork.nil? кирки был бы еще проще. Я использовал его много раз для таких вещей, как поддержка одновременное создание нескольких каталогов и т. д.)

Предложение Колина о EventMachine также будет работать и будет настолько быстрым, насколько это возможно, если вы правильно его реализуете (и если ваш рабочий процесс имеет смысл для четного асинхронного ввода-вывода), но будет далеко сложнее и сложнее. Поскольку вы не пытаетесь выполнить масштабирование до всей вселенной, вам просто нужно выполнить некоторые локальные служебные задачи, я думаю, что потоки хорошо сработают и создадут более простой, более читаемый и обслуживаемый код.

1 голос
/ 20 марта 2010

Я только что нашел это вчера, это может помочь вам - http://github.com/rightscale/right_popen,, который опирается на EventMachine: http://rubyeventmachine.com/. Написание сценария в стиле выравнивания или "реактора" избавит вас от головной боли. Думайте об этом как о написании JavaScript с некоторыми обратными вызовами.

Примерно так (я не знаком с EM, поэтому псевдокод):

do_something do |event|
  event.success{ next_script }
  event.failure{ report_failure }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...