Выполнить цикл 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

Монтаж

Если 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

Другие вопросы по тегам