¿Es esta la forma correcta de iniciar múltiples procesamientos secuenciales en segundo plano?
for i in {1..10}; do
for j in {1..10}; do
run_command $i $j;
done &
done;
Todos j
deben procesarse uno tras otro para un determinado i
, pero todos i
deben procesarse simultáneamente.
bash
background-process
for
parallelism
Controlado por radio
fuente
fuente
Respuestas:
El bucle externo que tienes es básicamente
Esto comenzaría diez instancias simultáneas de
some_compound_command
en segundo plano. Comenzarán lo más rápido posible, pero no "todo al mismo tiempo" (es decir, sisome_compound_command
toma muy poco tiempo, entonces el primero bien puede terminar antes de que comience el último).El hecho de que
some_compound_command
sea un bucle no es importante. Esto significa que el código que muestra es correcto en que las iteraciones delj
bucle interno se ejecutarán secuencialmente, pero todas las instancias del bucle interno (una por iteración deli
bucle externo ) se iniciarían simultáneamente.Lo único a tener en cuenta es que cada trabajo en segundo plano se ejecutará en una subshell. Esto significa que los cambios realizados en el entorno (p. Ej., Modificaciones en los valores de las variables de shell, cambios en el directorio de trabajo actual con
cd
, etc.) en una instancia del bucle interno no serán visibles fuera de ese trabajo en segundo plano en particular.Lo que quizás desee agregar es una
wait
declaración después de su ciclo, solo para esperar a que todos los trabajos en segundo plano realmente finalicen, al menos antes de que finalice el script:fuente
Si tiene GNU Parallel, haría:
Uno de los beneficios es que la salida de la ejecución en paralelo
run_commands
no se mezclará.fuente