GNU parallel vs & (я имею в виду фон) vs xargs -P

Я смущен различием или преимуществом (если есть) запуска набора задач в сценарии .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 

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

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

GNU parallel – это инструмент оболочки для параллельного выполнения заданий с использованием одного или нескольких компьютеров . Типичным входом является список файлов, список хостов , список пользователей, список 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 не поддерживает запуск заданий на удаленных компьютерах.
  • xargs не поддерживает замену контекста, поэтому вам придется создавать аргументы.