Estoy confundido acerca de la diferencia o la ventaja (si la hay) de ejecutar un conjunto de tareas en un .sh
script usando GNU parallel
P.ej. Respuesta de Ole Tange:
parallel ./pngout -s0 {} R{} ::: *.png
en lugar de decir recorrerlos colocándolos en segundo plano &
.
P.ej. 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 solo sintácticamente o prácticamente diferentes? Y si son prácticamente diferentes, ¿cuándo debo usar cada uno?
Respuesta aceptada:
Poner múltiples trabajos en segundo plano es una buena manera de usar los múltiples núcleos de una sola máquina. parallel
sin embargo, le permite repartir trabajos entre múltiples servidores de su red. De man parallel
:
GNU paralelo 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, parallel
le da un control mucho mayor sobre cómo se paralelizan sus trabajos. Toma este ejemplo del man
página:
To convert *.wav to *.mp3 using LAME running one process per CPU core
run:
parallel lame {} -o {.}.mp3 ::: *.wav
Vale, 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 .wav
hay. archivos Si ejecuta esto en unos pocos miles de archivos, es probable que ponga de rodillas a una computadora portátil normal. parallel
por otro lado, iniciará un trabajo por núcleo de CPU y mantendrá todo limpio y ordenado.
Básicamente, parallel
le ofrece la capacidad de ajustar cómo se ejecutan sus trabajos y cuántos recursos disponibles deben usar. Si realmente quieres ver el poder de esta herramienta, revisa su manual o, al menos, los ejemplos que ofrece.
El fondo simple realmente no tiene el nivel de sofisticación que se compara con el paralelo. En cuanto a cómo parallel
difiere de xargs
, la gente de GNU da un buen desglose aquí. Algunos de los puntos más destacados son:
- xargs trata mal los 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 junta, p. 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 se ejecutan trabajos en paralelo usando xargs, la salida del segundo trabajo no se puede posponer hasta que se complete el primer trabajo.
- xargs no admite la ejecución de trabajos en equipos remotos.
- xargs no admite reemplazo de contexto, por lo que tendrá que crear los argumentos.