Паралель GNU vs & (я маю на увазі фон) проти 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:

Паралель GNU - це інструмент оболонки для виконання завдань паралельно з використанням одного або декількох комп'ютерів . Типовим входом є список файлів, список хостів , список користувачів, список 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 може виконувати задану кількість завдань паралельно, але не підтримує паралельне виконання завдань з числом cpu-ядер паралельно.
  • xargs не підтримує групування результатів, тому вихід може працювати разом, наприклад, перша половина рядка відбувається з одного процесу, а остання половина рядка - з іншого процесу.
  • xargs не підтримує впорядкування виводу, тому, якщо паралельно виконувати завдання, використовуючи xargs, вихід другого завдання не може бути відкладений, поки не буде виконано перше завдання.
  • xargs не підтримує виконання завдань на віддалених комп'ютерах.
  • xargs не підтримує заміну контексту, тому вам доведеться створити аргументи.

1
Це гарна відповідь, THX. Це свого роду підтверджує те, що я здогадався. Я ненавиджу parallelсинтаксис, ще один новий бренд клавіатури, що запам'ятовується. Але я здогадуюсь, що авто балансування по ядрах / робочих місцях того варте ...?
Стівен Хендерсон

3
Подивіться, semщо є частиною пакету GNU Parallel. Це може відповідати вашим вимогам синтаксису.
Оле Танге

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

> xargs не підтримує заміну контексту, тому вам доведеться створити аргументи. --- Що це означає? Хіба це не xargs -I%
дощ

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