Linux Parallel pour exécuter des process en parallèle et gagner du temps

Pourquoi utiliser parallel?

Parallel nous permet de faire tourner un programme simultanément sur plusieurs coeurs. Comme aujourd’hui tous les ordinateur on t des chips multicoeur, il ne faudrait pas s’en priver si nous avons des tâches intensives en calcul à faire.

Pour installer parallel :

sudo apt install parallel

Parallel exploite le multicoeur de votre système, pour connaitre le nombre de coeurs physique de votre machine :

$ lscpu

Autre méthode comme tout est fichier dans linux, dans le répertoire proc

vim /proc/cpuinfo

La commande nproc affiche des informations plusconcises

$ nproc

4

Rappel : les process, jobs, avant plan (foreground) et arrière plan (background)

Le signe & pour mettre en arrière plan

ping google.com > ping.txt &
[1] 2606

# exemple avec un script shell
./script.sh  &

La commande jobs

Elle permet de lister les process en arrière plan

jobs
[2]+  Running                 ping google.fr > ping.txt &
 
# pour tuer un process :
kill -9 2606 << le numéro de process

Attendre que des process en background se terminent avant de lancer un autre process

command 1 &
command 2 &
wait
command3

ex  dans un script shell : 
#!/bin/bash
sleep 5 &
sleep 10 &
wait
echo "Bonjour"

Comparaison de la conversion de fichier image avec la commande convert (d’ImageMagick)

Nous allons convertir des images jpg en image png avec la commande convert, d’abord sans parallel puis avec parallel.

Pour télécharger les images, les urls sont dans le fichier à télécharger, ce sont des images du site unsplash.com.

Avec une commande en une ligne on va télécharger toutes ces images, je vous conseille de créer un répertoire image

cat images.txt | xargs wget
grâce au piping et avec xargs, et wget.
Mais les images téléchargée doivent être renommées pour que ce soit plus pratique, voici le script à lancer (il n'est pas parfait mais fait le job)

#!/bin/bash
IMAGES=$(ls)
I=0
for IMAGE in $IMAGES
do
        MIME=$(file -b --mime-type $IMAGE)
        EXT=$(echo "$MIME" | cut -d'/' -f2)
        if
        mv $IMAGE "image"_${I}.$EXT
        I=$((I+1))
done

Ce script va nommer les images avec l’extension trouvée à partir du MIME-type, et numéroter les images. A présent on est prêt pour la conversion. On va utiliser la commande time pour avoir la durée d’exécution

#script bash avec parallel

#!/bin/bash
parallel convert {} {.}.png ::: *.jpeg


# avec parallel
real    1m44,358s
user    6m13,489s
sys     0m21,999s

#script sans parallel

#!/bin/bash
IMAGES=$(ls *.jpeg)
for IMAGE in $IMAGES
do
        FILENAME="${IMAGE%.*}"
        convert $IMAGE ${FILENAME}.png


done

real    2m26,348s
user    2m39,110s
sys     0m2,865s
Retour en haut