Комбинирование опций xargs
Для нашей последней задачи мы рассмотрим, как обрабатывать книги партиями, при этом используя параллельную обработку. Мы применим несколько другой подход, чем изначально предложенный, чтобы избежать взаимоисключаемости опций -n
и -I
.
Посмотрим на наш список классических книг:
cat ~/project/classic_books.txt
Вы должны увидеть:
Moby_Dick
War_and_Peace
Ulysses
Don_Quixote
The_Odyssey
Madame_Bovary
Lolita
Hamlet
The_Iliad
Crime_and_Punishment
Теперь используем xargs
для обработки этих книг партиями по 2, с максимальным количеством параллельных процессов равным 3:
cat ~/project/classic_books.txt | xargs -n 2 -P 3 sh -c 'echo "Processing batch: $0 $1"'
Разберем эту команду:
cat ~/project/classic_books.txt
: Эта команда читает наш список классических книг.
|
: Этот символ канала (pipe) отправляет вывод в xargs
.
xargs
: Это наша команда для создания и выполнения команд на основе стандартного ввода.
-n 2
: Эта опция сообщает xargs
использовать 2 аргумента (названия книг) при каждом выполнении команды.
-P 3
: Эта опция сообщает xargs
запускать до 3 процессов параллельно.
sh -c 'echo "Processing batch: $0 $1"'
: Это команда, которую xargs
будет выполнять. Она использует оболочку (shell) для вывода названий книг. $0
и $1
представляют два названия книг, переданных xargs
.
Вы должны увидеть вывод, похожий на следующий:
Processing batch: Moby_Dick War_and_Peace
Processing batch: Ulysses Don_Quixote
Processing batch: The_Odyssey Madame_Bovary
Processing batch: Lolita Hamlet
Processing batch: The_Iliad Crime_and_Punishment
Эта команда демонстрирует, как можно эффективно обрабатывать большое количество элементов партиями, при этом используя параллельную обработку. В данном случае мы обрабатываем книги парами (из-за -n 2
) и запускаем до трех таких команд обработки пар параллельно (из-за -P 3
).
Преимущество этого подхода заключается в том, что он позволяет обрабатывать элементы в управляемых частях (в данном случае, парами книг), при этом используя параллельную обработку для ускорения всей операции. Это может быть особенно полезно при работе с большими наборами данных или когда необходимо найти баланс между скоростью обработки и использованием системных ресурсов.
В реальной ситуации вы можете заменить команду echo
более сложным скриптом обработки. Например, вы можете модифицировать наш предыдущий скрипт process_book.sh
так, чтобы он обрабатывал сразу две книги, а затем использовать его вместо команды echo
.