GNU paralelo vs & (quiero decir fondo) vs xargs -P


40

Estoy confundido acerca de la diferencia o ventaja (si existe) de ejecutar un conjunto de tareas en un .shscript usandoGNU parallel

Por ejemplo , la respuesta de Ole Tange :

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

en lugar de decir bucle a través de ellos y ponerlos en segundo plano &.

Por ejemplo , la respuesta 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 resumen, ¿son sintáctica o prácticamente diferentes? Y si es prácticamente diferente, ¿cuándo debo usar cada uno?

Respuestas:


46

Poner múltiples trabajos en segundo plano es una buena manera de usar los múltiples núcleos de una sola máquina. parallelsin embargo, le permite distribuir trabajos en varios servidores de su red. De man parallel:

GNU parallel es una herramienta de shell para ejecutar trabajos en paralelo usando una o más computadoras . La entrada típica es una lista de archivos, una lista de hosts , una lista de usuarios, una lista de URL o una lista de tablas.

Incluso cuando se ejecuta en una sola computadora, parallelle brinda un control mucho mayor sobre cómo se paralelizan sus trabajos. Tome este ejemplo de la manpágina:

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

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

OK, podrías hacer lo mismo con

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

Sin embargo, eso es más largo y engorroso y, lo que es más importante, lanzará tantos trabajos como .wavarchivos. Si ejecuta esto en unos pocos miles de archivos, es probable que ponga de rodillas a una computadora portátil normal. parallelPor otro lado, lanzará un trabajo por núcleo de CPU y mantendrá todo bien y ordenado.

Básicamente, le parallelofrece la capacidad de ajustar cómo se ejecutan sus trabajos y qué cantidad de recursos disponibles deberían usar. Si realmente desea ver el poder de esta herramienta, consulte su manual o, al menos, los ejemplos que ofrece.

El fondo simple realmente no tiene nada cerca del nivel de sofisticación que se compara con el paralelo. En cuanto a cómo paralleldifiere xargs, la multitud de GNU da un buen desglose aquí . Algunos de los puntos más destacados son:

  • xargs trata mal con caracteres especiales (como espacio, 'y ").
  • xargs puede ejecutar un número determinado de trabajos en paralelo, pero no tiene soporte para ejecutar trabajos de número de núcleos de CPU en paralelo.
  • xargs no tiene soporte para agrupar la salida, por lo tanto, la salida puede ejecutarse juntos, por ejemplo, la primera mitad de una línea es de un proceso y la última mitad de la línea es de otro proceso.
  • xargs no tiene soporte para mantener el orden de la salida, por lo tanto, si ejecuta trabajos en paralelo usando xargs, la salida del segundo trabajo no puede posponerse hasta que se complete el primer trabajo.
  • xargs no tiene soporte para ejecutar trabajos en computadoras remotas.
  • xargs no tiene soporte para reemplazar contexto, por lo que tendrá que crear los argumentos.

1
Esa es una buena respuesta, gracias. De alguna manera confirma lo que adiviné. Odio la parallelsintaxis, otra nueva marca de teclado-faceroll para memorizar. Pero supongo que el equilibrio automático entre núcleos / trabajos vale la pena ...
Stephen Henderson

3
Eche un vistazo a semcuál es parte del paquete paralelo de GNU. Eso podría adaptarse mejor a sus requisitos de sintaxis.
Ole Tange

1
@OleTange thx, buena decisión
Stephen Henderson

> xargs no tiene soporte para el reemplazo de contexto, por lo que deberá crear los argumentos. --- ¿Qué significa esto? ¿No es xargs -I%
lluvia

44
Es cierto que paralleles más poderoso que xargs, pero esa comparación es bastante sesgada. Por ejemplo, xargsadmite cadenas terminadas en nulo como entrada para evitar problemas con espacios y comillas, y también puede -demular parallel(¡incluso mencionado en la comparación!). xargs -Ies un reemplazo de contexto suficiente para la mayoría de los casos simples, y generalmente sé el número de núcleos en la máquina. Nunca tuve un problema con la salida desagrupada.
Sam Brightman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.