J'ai le script Bash suivant:
for i in {0800..9999}; do
for j in {001..032}; do
wget http://example.com/"$i-$j".jpg
done
done
Toutes les photos existent et, en fait, chaque itération ne dépend pas d'un autre. Comment le parallementer avec possibilité de contrôler le nombre de threads?
La réponse de Confiq est une bonne chose pour le petit i
et j
. Cependant, étant donné la taille de i
et j
dans votre question, vous voudrez probablement limiter le nombre total de processus engendrés. Vous pouvez le faire avec la commande parallel
ou certaines versions de xargs
. Par exemple, en utilisant un xargs qui prend en charge le -P
Flag Vous pouvez paralliser votre boucle interne comme suit:
for i in {0800..9999}; do
echo {001..032} | xargs -n 1 -P 8 -I{} wget http://example.com/"$i-{}".jpg
done
GNU parallèle a un grand nombre de fonctionnalités lorsque vous avez besoin de comportement plus sophistiqué et facilite la parallélise sur les deux paramètres:
parallel -a <(seq 0800 9999) -a <(seq 001 032) -P 8 wget http://example.com/{1}-{2}.jpg
for i in {1..3}; do
for j in {10..20}; do
(wget http://example.com/"$i-$j".jpg &)
done
done
Je l'ai même testé ...
Voici une approche très simpliste. Limite les fils à 10 dans cet exemple.
for i in {0800..9999}; do
for j in {001..032}; do
wget http://example.com/"$i-$j".jpg &
while test $(jobs -p|wc -w) -ge 10; do sleep 0.1 ; done
done
done