Je ne comprends pas la différence ou l'avantage (le cas échéant) d'exécuter un ensemble de tâches dans un .sh
script utilisant GNU parallel
Par exemple. Réponse d'Ole Tange :
parallel ./pngout -s0 {} R{} ::: *.png
plutôt que de les parcourir en boucle en les mettant en arrière-plan &
.
Par exemple. Réponse de Frostschutz :
#copied from the link for illustration
for stuff in things
do
( something
with
stuff ) &
done
wait # for all the something with stuff
En bref, sont-ils simplement syntaxiquement ou pratiquement différents ? Et s'ils sont pratiquement différents, quand dois-je les utiliser ?
Réponse acceptée :
Mettre plusieurs tâches en arrière-plan est un bon moyen d'utiliser les multiples cœurs d'une seule machine. parallel
cependant, vous permet de répartir les tâches sur plusieurs serveurs de votre réseau. De man parallel
:
GNU parallel est un outil shell permettant d'exécuter des tâches en parallèle à l'aide d'
un ou plusieurs ordinateurs . L'entrée typique est une liste de
fichiers, une liste d'hôtes , une liste d'utilisateurs, une liste d'URL ou une liste de tables.
Même lors de l'exécution sur un seul ordinateur, parallel
vous donne un bien meilleur contrôle sur la façon dont vos travaux sont parallélisés. Prenez cet exemple du man
page :
To convert *.wav to *.mp3 using LAME running one process per CPU core
run:
parallel lame {} -o {.}.mp3 ::: *.wav
OK, vous pouvez faire la même chose avec
for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done
Cependant, c'est plus long et plus lourd et, surtout, cela lancera autant de tâches qu'il y a de .wav
des dossiers. Si vous l'exécutez sur quelques milliers de fichiers, cela risque de mettre un ordinateur portable normal à genoux. parallel
d'autre part, lancera une tâche par cœur de processeur et gardera tout bien rangé.
Fondamentalement, parallel
vous offre la possibilité d'affiner la façon dont vos travaux sont exécutés et la quantité de ressources disponibles qu'ils doivent utiliser. Si vous voulez vraiment voir la puissance de cet outil, parcourez son manuel ou, à tout le moins, les exemples qu'il propose.
L'arrière-plan simple n'a vraiment pas le niveau de sophistication à comparer au parallèle. Quant à savoir comment parallel
diffère de xargs
, la foule GNU donne une belle répartition ici. Certains des points les plus saillants sont :
- xargs gère mal les caractères spéciaux (tels que l'espace, " et ").
- xargs peut exécuter un nombre donné de tâches en parallèle, mais ne prend pas en charge l'exécution de tâches multicœurs en parallèle.
- xargs n'a pas de support pour regrouper la sortie, donc la sortie peut fonctionner ensemble, par ex. la première moitié d'une ligne provient d'un processus et la dernière moitié de la ligne provient d'un autre processus.
- xargs ne prend pas en charge le maintien de l'ordre de la sortie. Par conséquent, si des tâches sont exécutées en parallèle à l'aide de xargs, la sortie de la deuxième tâche ne peut pas être reportée jusqu'à ce que la première tâche soit terminée.
- xargs ne prend pas en charge l'exécution de tâches sur des ordinateurs distants.
- xargs ne prend pas en charge le remplacement de contexte, vous devrez donc créer les arguments.