GNU parallel

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Parallel
Тип Утилита
Автор Ole Tange[вд][5]
Разработчик Проект GNU
Написана на Perl
Операционная система GNU
Первый выпуск 6 января 2002[1][2]
Последняя версия
Тестовая версия
Репозиторий git.savannah.gnu.org/cgi…
Лицензия GPLv3
Сайт gnu.org/software/parallel/
Логотип Викисклада Медиафайлы на Викискладе

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

Использование

[править | править код]
Вводное видео, Часть 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. Tange O. First version of Parallel recovered (англ.) — 2021.
  2. Tange O. GNU Parallel's 20th birthday (англ.)GNU.org, 2022.
  3. Tange O. GNU Parallel 20241022 ('Sinwar Nasrallah') released [stable(англ.) — 2024.
  4. Tange O. GNU Parallel 20241122 ('Ahoo Daryaei') released (англ.) — 2024.
  5. GNU's Who
  6. GNU Parallel. GNU.org. Дата обращения: 30 ноября 2016. Архивировано 1 февраля 2021 года.