GNU parallel vs & (je veux dire fond) vs xargs -P

40

Je suis confus quant à la différence ou à l'avantage (le cas échéant) de l'exécution d'un ensemble de tâches dans un .shscript à l'aide deGNU parallel

Par exemple, la réponse d' Ole Tange :

parallel ./pngout -s0 {} R{} ::: *.png

plutôt que de dire en boucle à travers eux en les mettant en arrière-plan &.

Par exemple, la 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 différents sur le plan syntaxique ou pratique? Et si pratiquement différent, quand devrais-je utiliser chacun?

Stephen Henderson
la source

Réponses:

46

Mettre plusieurs tâches en arrière-plan est un bon moyen d’utiliser les multiples cœurs d’une même machine. parallelCependant, 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 de 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 lorsque vous travaillez sur un seul ordinateur, parallelvous avez un contrôle bien plus grand sur la mise en parallèle de vos tâches. Prenons cet exemple de la manpage:

   To convert *.wav to *.mp3 using LAME running one process per CPU core
   run:

   parallel lame {} -o {.}.mp3 ::: *.wav

OK, vous pourriez faire la même chose avec

   for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done

Cependant, cela est plus long et plus lourd et, plus important encore, il lancera autant de tâches qu'il y a de .wavfichiers. Si vous utilisez cela sur quelques milliers de fichiers, il est probable qu'un ordinateur portable normal se mettra à genoux. paralleld’autre part, lancera un travail par cœur de processeur et veillera à ce que tout soit bien rangé.

En gros, parallelvous offre la possibilité d’affiner la manière dont vos tâches sont exécutées et la quantité de ressources disponibles qu’elles devraient utiliser. Si vous voulez vraiment voir la puissance de cet outil, parcourez son manuel ou, à tout le moins, ses exemples.

Le décor simple n'a vraiment pas le niveau de sophistication comparable au parallèle. En ce qui concerne comment paralleldiffère de xargs, la foule GNU donne une belle ventilation ici . Certains des points les plus saillants sont:

  • xargs traite mal les caractères spéciaux (tels que espace, 'et ").
  • xargs peut exécuter un nombre donné de travaux en parallèle, mais ne prend pas en charge l'exécution de travaux comportant un nombre de cpu-cœurs en parallèle.
  • xargs ne prend pas en charge le regroupement de la sortie; par conséquent, la sortie peut être exécutée ensemble. Par exemple, la première moitié d'une ligne provient d'un processus et la dernière moitié de la ligne, d'un autre processus.
  • xargs ne prend pas en charge le maintien de l'ordre de la sortie. Par conséquent, si vous exécutez des tâches en parallèle avec xargs, la sortie du deuxième travail ne peut pas être différée jusqu'à la fin du premier travail.
  • xargs ne prend pas en charge l'exécution de travaux sur des ordinateurs distants.
  • xargs ne prend pas en charge le remplacement de contexte, vous devrez donc créer les arguments.
terdon
la source
1
C'est une bonne réponse, merci. Cela confirme en quelque sorte ce que j'ai deviné. Je déteste la parallelsyntaxe, encore une autre nouvelle marque de clavier-faceroll à mémoriser. Mais je suppose que l’équilibrage automatique entre cœurs / emplois en vaut la peine…?
Stephen Henderson
3
Regardez semce qui fait partie du paquet GNU Parallel. Cela conviendrait peut-être mieux à vos besoins en syntaxe.
Ole Tange
1
@OleTange thx, bon appel
Stephen Henderson
> xargs ne supporte pas le remplacement de contexte, vous devrez donc créer les arguments. --- Qu'est-ce que ça veut dire? N'est-ce pas xargs -I%
raine
4
C'est vrai que parallelc'est plus puissant que xargs, mais cette comparaison est plutôt biaisée. Par exemple, xargsprend en charge les chaînes à terminaison null en entrée pour éviter les problèmes d'espaces et de guillemets, et peut également -démuler parallel(même mentionné dans la comparaison!). xargs -Iest un remplacement de contexte suffisant pour la plupart des cas simples, et je connais généralement le nombre de cœurs sur la machine. Je n'ai jamais rencontré de problème avec les sorties non groupées.
Sam Brightman