xargs -P <n>
позволяет вам запускать <n>
команды параллельно.
Хотя -P
является нестандартным вариантом, его поддерживают как реализации GNU (Linux), так и macOS / BSD.
В следующем примере:
- выполняет одновременно максимум 3 команды одновременно,
- с дополнительными командами, запускаемыми только после завершения ранее запущенного процесса.
time xargs -P 3 -I {} sh -c 'eval "$1"' - {} <<'EOF'
sleep 1; echo 1
sleep 2; echo 2
sleep 3; echo 3
echo 4
EOF
Вывод выглядит примерно так:
1 # output from 1st command
4 # output from *last* command, which started as soon as the count dropped below 3
2 # output from 2nd command
3 # output from 3rd command
real 0m3.012s
user 0m0.011s
sys 0m0.008s
Время показывает, что команды выполнялись параллельно (последняя команда была запущена только после первой из оригинальных3 завершается, но выполняется очень быстро).
Сама команда xargs
не вернется, пока все команды не будут завершены, но вы можете выполнить ее в фоновом режиме, завершив ее с помощью оператора управления &
, а затемиспользуя встроенную функцию wait
для ожидания завершения всей команды xargs
.
{
xargs -P 3 -I {} sh -c 'eval "$1"' - {} <<'EOF'
sleep 1; echo 1
sleep 2; echo 2
sleep 3; echo 3
echo 4
EOF
} &
# Script execution continues here while `xargs` is running
# in the background.
echo "Waiting for commands to finish..."
# Wait for `xargs` to finish, via special variable $!, which contains
# the PID of the most recently started background process.
wait $!
Примечание:
BSD / macOS xargs
требует от васуказать количество команд дляпараллельный запуск явно , тогда как GNU xargs
позволяет указать -P 0
для одновременного выполнения максимально возможного числа .
Выходные данные параллельно запущенных процессов поступают , так как он генерируется , поэтому он будет непредсказуемо перемеженным .
- GNU
parallel
, как указано в Ответ Оле (* не входит в стандартную комплектацию большинства платформ), удобно сериализует (группирует) выходные данные для каждого процесса и предлагает множество дополнительных функций.