Как уже упоминалось в комментариях, вы можете рассмотреть возможность использования GNU Parallel , это облегчает жизнь при управлении параллельными заданиями. Ваш код может выглядеть следующим образом:
#!/usr/bin/env bash
function job {
# resource intensive job simulated by random sleeping
echo param1="$1",param2="$2"
((s=(RANDOM%5)+1))
echo Sleeping for $s
sleep $s
}
# export function to subshells
export -f job
parallel -j8 job {1} {2} ::: 1e-6 1e-5 1e-4 1e-3 1e-2 ::: "ones" "random"
Пример вывода
param1=1e-6,param2=ones
Sleeping for 1
param1=1e-5,param2=ones
Sleeping for 1
param1=1e-2,param2=ones
Sleeping for 1
param1=1e-4,param2=ones
Sleeping for 2
param1=1e-4,param2=random
Sleeping for 2
param1=1e-6,param2=random
Sleeping for 4
param1=1e-2,param2=random
Sleeping for 3
param1=1e-3,param2=random
Sleeping for 4
param1=1e-5,param2=random
Sleeping for 5
param1=1e-3,param2=ones
Sleeping for 5
Есть много других параметров и параметров:
-
parallel --dry-run ...
покажет вам, что он будет делать, фактически ничего не делая
parallel --eta ...
, что дает вам "Расчетное время прибытия"
parallel --bar ...
, который дает вам индикатор выполнения parallel -k ...
, который сохраняет вывод в порядке parallel -j 8 ...
, который запускает 8 заданий одновременно, а не по умолчанию 1 задание на процессор core parallel --pipepart ...
, который разделит содержимое массивного файла по подпроцессам
Обратите внимание также, что GNU Parallel может распределять работу по другим машинам в вашей сети, и это дает сбой и повторная обработка, вывод тегов и т. д. ...