Когда вы запускаете множество команд последовательно, выполнение скрипта может занять значительное время. Параллельное выполнение задач позволяет значительно ускорить процесс, особенно если команды не зависят друг от друга. В этой статье рассмотрим:
Как запустить команды в фоне.
Как ограничить количество параллельно выполняемых задач.
Сравним результаты для наглядной демонстрации.
1. Параллельное выполнение с &. Чтобы запустить команду в фоновом режиме, просто добавьте & в конце строки:
sleep 5 & # Фоновая задача
echo "Команда завершена"
wait # Ожидание завершения всех фоновых задач
2. Ограничение количества фоновых задач. Когда слишком много задач выполняются параллельно, это может перегрузить систему. Чтобы избежать этого, можно использовать ограничение.
Пример с семафором (функция parallel_run):
#!/bin/bash
# Функция для параллельного выполнения с ограничением
parallel_run() {
local max_jobs=4 # Максимальное количество фоновых задач
local job_count=0
for i in {1..10}; do
{
echo "Начало задачи $i"
sleep $((RANDOM % 5 + 1)) # Симуляция работы
echo "Задача $i завершена"
} &
((job_count++))
if [[ $job_count -ge $max_jobs ]]; then
wait -n # Ждём завершения одной из задач
((job_count--))
fi
done
wait # Ожидание завершения всех оставшихся задач
}
# Запуск
parallel_run
Результат выполнения:
Начало задачи 1
Начало задачи 2
Начало задачи 3
Начало задачи 4
Задача 2 завершена
Начало задачи 5
...
Количество одновременно выполняемых задач не превышает 4.
3. Сравнение производительности
Скрипт с последовательным выполнением:
#!/bin/bash
for i in {1..10}; do
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
done
Результат: время выполнения = 10 задач × 2 секунды = 20 секунд.
Скрипт с параллельным выполнением:
Копировать код
#!/bin/bash
for i in {1..10}; do
{
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
} &
done
wait
Результат: Все задачи запускаются одновременно. Время выполнения ≈ 2 секунды.
Скрипт с ограничением фоновых задач:
Копировать код
#!/bin/bash
parallel_run() {
local max_jobs=3
local job_count=0
for i in {1..10}; do
{
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
} &
((job_count++))
if [[ $job_count -ge $max_jobs ]]; then
wait -n
((job_count--))
fi
done
wait
}
parallel_run
Результат: Ограничение до 3 задач одновременно. Время выполнения ≈ 7–8 секунд.
---
Дополнительный инструмент:
xargsДля простого ограничения количества задач можно использовать xargs с флагом -P:
seq 1 10 | xargs -n1 -P4 -I{} bash -c 'echo "Начало задачи {}"; sleep 2; echo "Задача {} завершена"'
-P4: ограничение на 4 параллельные задачи.
В результате получается, что параллельное выполнение задач в Bash значительно ускоряет работу скриптов:
👎 Полное отсутствие ограничений может перегрузить систему.
👍 Ограничение количества задач помогает сбалансировать нагрузку.
👍 Использование инструментов, таких как wait, xargs, или написание собственных функций, позволяет гибко управлять параллельностью.
BashTex 📱 #linux #utils