Выполнить цикл Shell параллельно, но только N рабочих
У нас есть более 100 репозиториев Git, и иногда я хочу grep
в общем и целом.
Для обновления репозиториев я использую это:
for repo in *; do (cd $repo; git checkout master; git pull); done
Это довольно медленно.
Как ускорить это?
Запуск всех обновлений одновременно вызовет слишком много процессов.
Мне нужен способ уменьшить нагрузку на N рабочих.
У кого-нибудь есть решение этой проблемы?
3 ответа
Вы можете использовать GNU параллельно для выполнения этой задачи. С главной страницы параллельной GNU,
"Задание также может быть командой, которая читает из канала. Затем GNU Параллельно может разделить ввод и направить его в команды параллельно".
Существует отличное учебное пособие, и этот конкретный раздел посвящен тому, что именно вы спросили.
Редактировать: вот команда, которую вы можете использовать. (Немного изменено из ответа Оле Тана)
parallel -j<number of jobs to run> 'cd {} && git checkout master && git pull' ::: */
Это вызовет параллельное "количество заданий", которое вы указали, и выполнит все, что вы просили сделать.
НТН
Вы можете использовать xargs, например,
(for repo in *
do
[ -d ${repo} ] && echo ${repo}
done ) | xargs -I{} -P4 ./gitActions.sh {}
Флаг -P4
говорит xargs запускать до 4 одновременных процессов, чтобы вы могли играть с тем количеством процессов, которое вам нужно / нужно.
Тогда ваш файл gitActions.sh должен содержать:
#!/bin/bash
repo=$1
cd $repo; git checkout master; git pull
Используя GNU Parallel это выглядит так:
parallel -j77 'cd {} && git checkout master && git pull' ::: */
Это дает 77 рабочих.
GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh. Это часто может заменить for
петля.
Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:
GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая процессоры активными и, таким образом, экономя время:
Монтаж
Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку, которая не требует root-доступа. Это можно сделать за 10 секунд, выполнив это:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
Для других вариантов установки см. http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Учить больше
Смотрите больше примеров: http://www.gnu.org/software/parallel/man.html
Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Просмотрите учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html
Подпишитесь на список рассылки, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel