GNU параллельно против & (я имею в виду фон) против xargs -P


40

Я смущен разницей или преимуществом (если есть) запуска набора задач в .shскрипте с использованиемGNU parallel

Например, ответ Оле Танге :

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

вместо того, чтобы повторять их в фоновом режиме &.

Например, ответ frostschutz :

#copied from the link for illustration
for stuff in things
do
( something
  with
  stuff ) &
done
wait # for all the something with stuff

Короче говоря, они просто синтаксически или практически разные? И если практически разные, когда я должен использовать каждый?

Ответы:


46

Размещение нескольких заданий в фоновом режиме - это хороший способ использования нескольких ядер одной машины. parallelоднако позволяет распределять задания по нескольким серверам вашей сети. От man parallel:

GNUrallel - это инструмент оболочки для параллельного выполнения заданий с использованием одного или нескольких компьютеров . Типичным вводом является список файлов, список хостов , список пользователей, список URL-адресов или список таблиц.

Даже при работе на одном компьютере parallelдает гораздо больший контроль над распараллеливанием ваших заданий. Возьмите этот пример со manстраницы:

   To convert *.wav to *.mp3 using LAME running one process per CPU core
   run:

   parallel lame {} -o {.}.mp3 ::: *.wav

Хорошо, вы могли бы сделать то же самое с

   for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done

Однако это длиннее и громоздче, и, что более важно, запустит столько заданий, сколько есть .wavфайлов. Если вы запустите это на нескольких тысячах файлов, это может поставить нормальный ноутбук на колени. parallelс другой стороны, запустит одну работу на ядро ​​процессора и будет держать все в порядке.

По сути, parallelпредлагает вам возможность точно настроить, как выполняются ваши задания и сколько доступных ресурсов они должны использовать. Если вы действительно хотите увидеть всю мощь этого инструмента, изучите его руководство или, по крайней мере, примеры, которые он предлагает.

Простое фоновое изображение действительно не соответствует уровню сложности, который можно сравнить с параллельным. Что касается того, как parallelотличается от xargsтолпы GNU дать хороший разбивка здесь . Некоторые из наиболее важных моментов:

  • xargs плохо работает со специальными символами (такими как пробел, 'и ").
  • xargs может выполнять заданное количество заданий параллельно, но не поддерживает параллельное выполнение заданий количества процессоров.
  • xargs не поддерживает группировку вывода, поэтому вывод может выполняться вместе, например, первая половина строки принадлежит одному процессу, а последняя половина строки - другому процессу.
  • xargs не поддерживает сохранение порядка вывода, поэтому при параллельном выполнении заданий с использованием xargs вывод второго задания не может быть отложен до завершения первого задания.
  • xargs не поддерживает запуск заданий на удаленных компьютерах.
  • xargs не поддерживает замену контекста, поэтому вам придется создавать аргументы.

1
Это хороший ответ, спасибо. Это как бы подтверждает то, что я догадался. Я ненавижу parallelсинтаксис, еще один новый бренд клавиатуры-faceroll для запоминания. Но я думаю, что автоматическая балансировка между ядрами / заданиями того стоит?
Стивен Хендерсон

3
Посмотрите, semчто является частью пакета GNU Parallel. Это может лучше соответствовать вашим требованиям синтаксиса.
Оле Танге

1
@OleTange спасибо, хороший звонок
Стивен Хендерсон

> xargs не поддерживает замену контекста, поэтому вам придется создавать аргументы. --- Что это значит? Разве это не xargs -I%
дождь

4
Это правда, что parallelэто мощнее xargs, но это сравнение довольно предвзятым. Например, xargsподдерживает строки с нулевым символом в конце в качестве входных данных, чтобы избежать проблем с пробелами и кавычками, а также может -dэмулировать parallel(даже упомянутое в сравнении!). xargs -Iдостаточно замены контекста для большинства простых случаев, и я обычно знаю количество ядер на машине. У меня никогда не возникало проблем с разгруппированным выводом.
Сэм Брайтман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.