Четыре задачи параллельно …, как я делаю это?

Возможно, пробный прогон - то, что Вы ищете?

make --dry-run fred

Страница справочника дает нам это о пробном прогоне:

-n, --just-print, --dry-run, --recon
  Print the commands that would be  executed,  but  do  not 
  execute them.

Таким образом, это не даст Вам прямой список, но косвенный список, так как Вы знаете, что он хотел бы выполнить то, от чего он зависит.

23
11.09.2017, 13:59
4 ответа

Если у Вас есть копия xargs это поддерживает параллельное выполнение с -P, можно просто сделать

printf '%s\0' *.png | xargs -0 -I {} -P 4 ./pngout -s0 {} R{}

Для других идей Bash Wooledge Wiki имеет раздел в статье управления процессами, описывающей точно, что Вы хотите.

33
27.01.2020, 19:41
  • 1
    Существуют также "параллель гну" и "xjobs", разработанный для этого случая. Это - главным образом вопрос вкуса, который Вы предпочитаете. –  wnoise 01.04.2012, 07:41
  • 2
    Вы могли объяснить предложенную команду?Спасибо! –  Eugene S 01.04.2012, 10:25
  • 3
    @EugeneS Вы могли быть немного более конкретны относительно какой часть? printf собирает все png файлы и передает их через канал к xargs, который собирает аргументы от стандартного входа и комбинирует их в аргументы в пользу pngout управляйте, чтобы OP хотел работать. Ключевая опция -P 4, который говорит xargs использовать до 4 параллельных команд. –  jw013 01.04.2012, 13:05
  • 4
    Извините за то, чтобы не быть точным. Мне конкретно было интересно, почему Вы использовали printf функционируйте здесь, а не просто регулярный ls .. | grep .. *.png? Также я интересовался xargs параметры Вы использовали (-0 и -I{}).Спасибо! –  Eugene S 01.04.2012, 14:12
  • 5
    @EugeneS Это для максимальной правильности и устойчивости. Имена файлов не являются строками, и ls не может использоваться для парсинга имен файлов портативно и безопасно. Единственные безопасные символы для использования для разграничивания имен файлов \0 и /, начиная с любого символа, включая \n, может быть часть самого имени файла. printf использование \0 разграничить имена файлов, и -0 сообщает xargs из этого. -I{} говорит xargs заменять {} с аргументом. –  jw013 01.04.2012, 21:23

Если у Вас есть Параллель GNU, http://www.gnu.org/software/parallel/ установил Вас, может сделать это:

parallel ./pngout -s0 {} R{} ::: *.png

Можно установить Параллель GNU просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Посмотрите вводные видео для Параллели GNU для узнавания больше: https://www.youtube.com/playlist? list=PL284C9FF2488BC6D1

7
27.01.2020, 19:41

В дополнение к решениям, уже предложенным, можно создать make-файл, который описывает, как сделать сжатый файл из несжатого, и использование make -j 4 выполнять 4 задания параллельно. Проблема состоит в том, что необходимо будет назвать сжатые и несжатые файлы по-другому или сохранить их в различных каталогах, еще пишущий, что разумное делает правило, будет невозможно.

8
27.01.2020, 19:41

Отвечать на Ваши два вопроса:

  • да, добавление и в конце строки сообщит, что Вы окружаете для запуска фонового процесса.
  • использование wait команда, можно попросить, чтобы оболочка ожидала всех процессов в фоновом режиме для окончания прежде, чем продолжиться дальше.

Вот сценарий, измененный так, чтобы j используется для отслеживания количество фоновых процессов. Когда NB_CONCURRENT_PROCESSES достигнут, сценарий сбросит j к 0 и ожидают всех фоновых процессов для окончания прежде, чем возобновить, что это - выполнение.

files=(./*.png)
nb_concurrent_processes=4
j=0
for f in "${files[@]}"
do
        echo "Processing $f file..."
        # take action on each file. $f store current file name
        ./pngout -s0 "$f" R"${f/\.\//}" &
        ((++j == nb_concurrent_processes)) && { j=0; wait; }
done
5
27.01.2020, 19:41
  • 1
    Это будет ожидать последнего из этих четырех параллельных процессов и затем запустит ряд еще четырех. Возможно, нужно создать массив четырех PIDs и затем ожидать этих определенных PIDs? –  Nils 31.03.2012, 22:59
  • 2
    Только объяснить мои меры коду: (1) Как стиль, избегайте всех прописных имен переменной, поскольку они потенциально конфликтуют с внутренними переменными оболочки. (2) Добавил заключение в кавычки на $f и т.д. (3) Использование [ для POSIX совместимые сценарии, но для чистого удара [[ всегда предпочитается. В этом случае, (( более подходит для арифметики. –  jw013 31.03.2012, 23:30

Теги

Похожие вопросы