GNU Parallel для бедняков реализована в ksh?

8

Я хотел бы использовать функцию параллельного запуска GNU, где он может выполнять команду и список, в который она подается параллельно, и выплевывать его после того, как все будет сделано, однако я не хочу устанавливать параллельный GNU на всех наших серверах.

Или, возможно, параллельная версия xargs?

Есть ли ksh-реализация того, что делает GNU Parallel? В этом случае это не нужно делать по порядку, как это делает GNU Parallel - до тех пор, пока весь вывод может быть передан по конвейеру или сохранен. Я также хотел бы избежать использования временных файлов.

Nitrodist
источник
GNU Parallel - это единственный Perl-скрипт. Мне любопытно, почему вы предпочитаете устанавливать скрипт ksh вместо установки одного скрипта perl, который разработан так, чтобы иметь очень мало зависимостей. Можете ли вы уточнить это? (Раскрытие: я автор GNU Parallel)
Оле Танге

Ответы:

6

Если вы хотите распараллелить на машине с несколькими ядрами, вы можете просто использовать (GNU) xargs, например:

echo seq_[0-9][0-9].gz | xargs -n 1 -P 16 ./crunching

Значение: xargsзапускает до 16 процессов параллельно с ./crunchingиспользованием 1 токена от stdin для каждого процесса.

Вы также можете использовать splitв сочетании с Xargs.

Или вы можете создать простой Makefile для выполнения задания и вызова make -f mymf -j $CORES(вам нужны временные файлы для этого решения).

PS: Руководство по параллельным GNU также включает некоторые сравнения с другими инструментами, включая xargs и make , что интересно, они пишут:

(Очень ранние версии параллельной GNU были по совпадению реализованы с использованием make -j).

maxschlepzig
источник
Для спрашивающего важно, что «весь вывод может быть передан по трубопроводу или сохранен». xargsОбщеизвестно, что это плохо при параллельной работе, поскольку выход может смешиваться.
Оле Танге
@maxschlepzig: Я согласен с вашим ответом на 100%, я всегда просто использую xargs. Многие люди просто не знают, что GNU xargs может выполнять параллель!
Дж. М. Беккер
0

Посмотрите, в parallel --embedкакой части встроен GNU Parallel в тот же сценарий оболочки, из которого вы его используете.

parallel --embed > new_script

затем отредактируйте new_script.

Оле Танге
источник