gnu parallel: encaminha todos os stdin para todos os processos

2

Estou tentando processar a entrada de diferentes maneiras em paralelo, escrevendo as linhas resultantes conforme elas entram. Minha abordagem atual é esta:

# process_parallel.sh
read input
parallel --colsep ' ' --linebuffer 'echo $input | {}' \
 ::: 'python process1.py' ./process2.sh ./process3

O contexto se resume a algo assim:

(sleep 1; echo "short input arriving late") | ./process_parallel.sh | ./collate_results.sh

O trabalho acima funciona, mas tem uma desvantagem importante: os processos não são iniciados até que a entrada tenha sido lida. Eu quero iniciá-los imediatamente, pois isso pode demorar um pouco, e então ter um canal paralelo para cada um deles.

Como faço para isso?

    
por Mr. Wonko 15.05.2015 / 16:20

2 respostas

1

Um pouco de trabalho foi colocado no Paralelo GNU para não iniciar um novo trabalho a menos que haja dados para serem executados. Isso se deve a alguns programas que falham com dificuldade, caso não recebam nenhuma entrada. Então você estará trabalhando contra o design do GNU Parallel.

Para duplicar a entrada, você pode usar tee e processar a substituição:

cat namedpipe_or_file | tee >(process1) >(process2) >(process3) >/dev/null

Ele iniciará process1 , process2 e process3 imediatamente. A saída pode, no entanto, ser misturada, portanto, se a saída deve ser usada, você deve redirecioná-la para arquivos diferentes:

cat namedpipe_or_file | tee >(process1 > out1) >(process2 > out2) >(process3 > out3) >/dev/null
    
por 15.05.2015 / 18:32
0

Tenha dois scripts de wrapper: primeiro, modifique process_parallel.sh para que cada um dos processos seja instruído a ler sua entrada, a partir de três arquivos, digamos, file1, file2, file3.

Agora escreva um segundo script wrapper que envie em paralelo sua entrada padrão para os três arquivos, algo como:

  #!/bins/bash
  #parallelise input
  # let's call this file parallelise
  parallel -j 3 -- "echo $1 > file1" "echo $1 > file2" "echo $1 file3"

Agora você começa suas coisas com:

  ./process_parallel_sh; cat InputFile | parallelise; 
    
por 15.05.2015 / 17:42