Poor man’s parallel con Bash

GNU Parallel es «una herramienta para ejecutar tareas en paralelo usando uno o varias computadoras». Es realmente compleja y versátil, pero muchas veces su uso se reduce a paralelizar un bucle. Algo así, para ejecutar 10 tasks utilizando 4 cores:

[code lang=»bash»]
task() {
echo «running $1…»
sleep $(($1%4))
echo «$1 stopped»
}
export -f task

for i in {1..10}; do
sem -j4 task $i
done
sem –wait
[/code]

Pero si no está disponible o da problemas, y no importa que la salida pueda intercalarse, se puede hacer lo mismo solo con Bash:

[code lang=»bash»]
task() {
echo «running $1…»
sleep $(($1%4))
echo «$1 stopped»
}
pmsem() { ((_i=_i%$1)); ((_i++==0)) && wait -n && ((_i–)); }

for i in {1..10}; do
pmsem 4; task $i &
done
wait
[/code]