GNU parallel

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Parallel
Gnu-parallel.svg
Тип Утилита
Автор Ole Tange[d]
Разработчик Проект GNU
Написана на Perl
Операционная система GNU
Первый выпуск 2007
Последняя версия 20160822[1] (22 августа 2016; 4 года назад (2016-08-22))
Тестовая версия
Лицензия GPLv3
Сайт gnu.org/software/parallel/
Commons-logo.svg Медиафайлы на Викискладе

GNU parallel является утилитой командной строки для ОС Linux и других Unix-подобных операционных систем, которая позволяет выполнять shell-скрипты параллельно. GNU parallel - это свободное программное обеспечение, написанное Оле Танге на языке Perl. Программа доступна в соответствии с условиями лицензии GPLv3.[3]

Использование[править | править код]

Вводное видео, Часть 1
Вводное видео, Часть 2

Чаще всего используется для замены циклов, например

    for x in `cat list` ; do 
            do_something "$x"
    done | process_output

на

    cat list | parallel do_something | process_output

где файл с именем list содержит аргументы для do_something и где process_output может быть пустым.

Скрипты использующие parallel часто легче читать, чем скрипты, использующие pexec.

Parallel включает также

  • группировка стандартного вывода и стандартного потока ошибок, поэтому вывод параллельно запущенных задач не работает вместе;
  • сохраняет порядок вывода, оставляя тот же самый порядок как на вводе;
  • приятно иметь дело с именами файлов, содержащих специальные символы, такие как пробел, одиночная кавычка, кавычки, амперсанд и кодировку UTF-8;

По умолчанию, параллельно запускается столько же задач, сколько и ядер процессора.

Примеры[править | править код]

 find . -name "*.foo" | parallel grep bar

Эквивалентно:

 find . -name "*.foo" -exec grep bar {} +

Это поиск во всех файлах в текущем каталоге и его подкаталогах, чье имя заканчивается на .foo и содержит строку bar. Parallel будет работать не так, как ожидается, если имя файла содержит символ новой строки. Для того чтобы избежать этого ограничения можно использовать:

 find . -name "*.foo" -print0 | parallel -0 grep bar

Команда выше использует нулевой символ для разделения имен файлов.

 find . -name "*.foo" | parallel -X mv {} /tmp/trash

Эта команда использует {} , чтобы сказать parallel , что нужно заменить {} списком аргументов.

 find . -maxdepth 1 -type f -name "*.ogg" | parallel -X -r cp -v -p {} /home/media

Приведенная выше команда делает то же, что:

 cp -v -p *.ogg /home/media

однако первая команда, которая использует find/parallel/cp является более эффективной в использовании ресурсов и не остановится с ошибкой, если раскрытие *.ogg будет слишком большим для shell.

См. также[править | править код]

Примечания[править | править код]

  1. Insivest, Ole GNU Parallel 20160822 ('Og Nomekop') released. Список рассылки (22 August 2016).
  2. Tange O. GNU Parallel 20210522 ('Gaza') released (англ.) — 2021.
  3. GNU Parallel. GNU.org.

Ссылки[править | править код]