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:

task() {
  echo "running ..."
  sleep $((%4))
  echo " stopped"
}
export -f task

for i in {1..10}; do
  sem -j4 task $i
done
sem --wait

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

task() {
  echo "running ..."
  sleep $((%4))
  echo " stopped"
}
pmsem() { ((_i=_i%)); ((_i++==0)) && wait -n && ((_i--)); }

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