У меня есть большой набор файлов, для которых необходимо выполнить тяжелую обработку.Эта обработка в однопоточном режиме использует несколько сотен мегабайт ОЗУ (на компьютере, на котором запускается задание) и занимает несколько минут.Мой текущий сценарий использования - запуск задания hadoop для входных данных, но у меня была такая же проблема в других случаях ранее.
Чтобы полностью использовать доступную мощность ЦП, я хочу иметь возможность запустить несколькоэти задачи в paralell.
Однако очень простой пример сценария оболочки, подобного этому, снизит производительность системы из-за чрезмерной загрузки и перестановки:
find . -type f | while read name ;
do
some_heavy_processing_command ${name} &
done
Так что то, что я хочу, по сути похоже на то, что"gmake -j4" делает.
Я знаю, что bash поддерживает команду "wait", но она ожидает только до завершения всех дочерних процессов.В прошлом я создавал сценарии, которые выполняют команду «ps», а затем выполняют grep дочернего процесса по имени (да, я знаю ... некрасиво).
Какое самое простое / самое чистое / лучшее решениеделать то, что я хочу?
Редактировать: Спасибо Фредерику: Да, действительно, это дубликат Как ограничить количество потоков / подпроцессов, используемых в функции в bash «Xargs --max-procs = 4» работает как шарм.(Так что я проголосовал, чтобы закрыть свой вопрос)