Essa é a maneira correta de iniciar vários processamentos seqüenciais em segundo plano?
for i in {1..10}; do
for j in {1..10}; do
run_command $i $j;
done &
done;
Todos j
devem ser processados um após o outro por um determinado i
, mas todos i
devem ser processados simultaneamente.
bash
background-process
for
parallelism
Rádio-controlado
fonte
fonte
Respostas:
O loop externo que você tem é basicamente
Isso iniciaria dez instâncias simultâneas
some_compound_command
em segundo plano. Eles serão iniciados o mais rápido possível, mas não totalmente "todos ao mesmo tempo" (ou seja, sesome_compound_command
demorar muito pouco, o primeiro poderá terminar antes do início do último).O fato
some_compound_command
de ser um loop não é importante. Isso significa que o código que você mostra está correto , pois as iterações doj
loop interno serão executadas seqüencialmente, mas todas as instâncias do loop interno (uma por iteração do loop externoi
) serão iniciadas simultaneamente.A única coisa a ter em mente é que cada trabalho em segundo plano será executado em um subshell. Isso significa que as alterações feitas no ambiente (por exemplo, modificações nos valores das variáveis do shell, alterações do diretório de trabalho atual com
cd
, etc.) em uma instância do loop interno não serão visíveis fora desse trabalho em segundo plano específico.O que você pode querer adicionar é uma
wait
declaração após o loop, apenas para aguardar a conclusão de todos os trabalhos em segundo plano, pelo menos antes do término do script:fonte
Se você possui o GNU Parallel, você faria:
Um dos benefícios é que a saída da execução paralela
run_commands
não se mistura.fonte