Execução em segundo plano em paralelo

2

Eu tenho um programa ./pgm levando alguns argumentos (digamos -a file1 -b val ), o que requer 2 segundos para ser executado. Eu gostaria de usar todos os processadores na minha máquina para executar este programa em todos os arquivos de entrada em paralelo (cerca de 1000). O que eu faço agora, é colocar todos os comandos

./pgm -a file1 -b 12 > out1.txt &
./pgm -a file2 -b 14 > out2.txt &
./pgm -a file3 -b 16 > out3.txt &
./pgm -a file4 -b 18 > out4.txt &
...

em um arquivo e execute este arquivo. Eu pensei que isso usaria todos os processadores disponíveis, mas o número de execução paralela é muito limitado.

Como posso conseguir isso? Observe que o comando parallel não é uma opção.

    
por wwjoze 18.02.2014 / 15:54

2 respostas

5

Com o GNU xargs :

seq 1000 | xargs -P4 -n1  sh -c 'exec ./pgm -a "file$1" -b 12 > "out.$1"' sh &

Correria até 4 ./pgm s em paralelo.

Caso contrário, com pdksh / mksh / oksh :

trap : CHLD
n=0
for f in file*; do
  jobs=$(jobs | wc -l)
  if (($jobs < 4)); then
    ./pgm "$f" > out.$((++n)) &
  else
    wait
  fi
done
trap - CHLD
wait

os detalhes da manipulação de sinal variam de um shell para o próximo. Esse truque funciona em pdksh e seus derivados, mas não em qualquer outro shell que eu tentei. Você precisa de um shell onde seja possível capturar SIGCHLD (exclui bash ), onde o manipulador SIGCHLD é executado imediatamente (não bloqueado durante um wait ) (exclui ash , yash ), onde o processamento do SIGCHLD interrompe o wait (exclui ksh93 e zsh ).

Em shells que não sejam bash , você também pode procurar abordagens em que as tarefas são iniciadas no manipulador SIGCHLD.

    
por 18.02.2014 / 16:02
1

Eu estava tendo um problema parecido. Como você especificou que parallel não é uma opção, talvez seja necessário examinar swift , conforme discutido na resposta de esta pergunta.

    
por 18.02.2014 / 16:15