У меня нетривиальный сценарий Bash, имеющий примерно следующую форму:
# Initialization
<generate_data> | while read line; do
# Run tests and filters on line
if [ "$tests_pass" ]; then
echo "$filtered_line"
fi
done | sort <sort_option> | <consume_data>
# Finalization
По сравнению с фильтром генератор потребляет минимальные ресурсы обработки, и, конечно, операция сортировки не может начаться, пока всеотфильтрованные данные доступны. Таким образом, фильтр, каскад из нескольких циклов и условных выражений, изначально написанных на Bash, является узким местом обработки, и один процесс, выполняющий этот цикл, потребляет все ядро.
Полезной целью было бы распространение этой логики. в нескольких дочерних процессах, каждый из которых запускает отдельные циклы фильтра и каждый из которых, в свою очередь, потребляет блоки строк из генератора и каждый из которых создает выходные блоки, объединенные в операцию сортировки. Функциональность такого рода доступна через такие инструменты, как GNU Parallel, но для их использования требуется запускать внешнюю команду для запуска в конвейере.
Имеется ли какой-либо удобный инструмент или функция, которая делает операции над сценарием распределенными по нескольким процессам, не нарушая общую структуру сценария? Я не знаю о встроенной функции Bash, но она наверняка будет полезна.