My question is how change this code so it will use only 4 threads/sub-processes?
TESTS="a b c d e"
for f in $TESTS; do
t=$[ ( $RANDOM % 5 ) + 1 ]
sleep $t && echo $f $t &
done
wait
I have found another solution for this question using parallel
(part of moreutils
package.)
parallel -j 4 -i bash -c "echo start {}; sleep 2; echo done {};" -- $(seq 10)
-j 4
stands for -j maxjobs
-i
uses the parameters as {}
--
delimits your arguments
The output of this command will be:
start 3
start 4
start 1
start 2
done 4
done 2
done 3
done 1
start 5
start 6
start 7
start 8
done 5
done 6
start 9
done 7
start 10
done 8
done 9
done 10
Quick and dirty solution: insert this line somewhere inside your for
loop:
while [ $(jobs | wc -l) -ge 4 ] ; do sleep 1 ; done
(assumes you don't already have other background jobs running in the same shell)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With