Digamos que tengo un bucle en Bash:guión paralelizar Bash con número máximo de procesos
for foo in `some-command`
do
do-something $foo
done
do-something
está obligado cpu y tengo una agradable procesador de núcleo brillante 4. Me gustaría poder ejecutar hasta 4 do-something
de una vez.
El enfoque ingenuo parece ser:
for foo in `some-command`
do
do-something $foo &
done
Esto ejecutará todosdo-something
s de una vez, pero hay un par de inconvenientes, sobre todo que lo hacen, algo también pueden tener alguna significativa de E/S, que realizar todo de una vez puede disminuir la velocidad un poco. El otro problema es que este bloque de código regresa inmediatamente, por lo que no hay forma de hacer otro trabajo cuando se completen todos los do-something
s.
¿Cómo se escribiría este ciclo para que siempre haya X do-something
funcionando a la vez?
Como sidenode, he soñado con la adición de la opción -j de hacer a la bas h para primitivo. No funcionaría siempre, pero para algunos casos simples en los que sabes que el cuerpo del ciclo va a hacer algo único para cada iteración, sería bastante sencillo decir "para -j 4 ...". – unwind
Referencia cruzada a http://stackoverflow.com/questions/1537956/bash-limit-the-number-of-concurrent-jobs/1685440#1685440 para una solución bash que mitiga los problemas de rendimiento y permite grupos de subprocesos , mantenido separado. – paxdiablo
Recomiendo mi solución http://stackoverflow.com/a/28965927/340581 – Tuttle