Первый: используйте 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 также будет работать и будет настолько быстрым, насколько это возможно, если вы правильно его реализуете (и если ваш рабочий процесс имеет смысл для четного асинхронного ввода-вывода), но будет далеко сложнее и сложнее. Поскольку вы не пытаетесь выполнить масштабирование до всей вселенной, вам просто нужно выполнить некоторые локальные служебные задачи, я думаю, что потоки хорошо сработают и создадут более простой, более читаемый и обслуживаемый код.