Paralelo GNU do pobre homem implementado em ksh?

8

Eu gostaria de usar o recurso GNU paralelo, onde ele pode executar o comando e a lista que é alimentada em paralelo e cuspir depois que tudo estiver pronto, no entanto, não quero instalar o GNU paralelo em todos os nossos servidores.

Ou talvez uma versão paralela de xargs?

Existe uma implementação ksh do que o GNU Parallel faz? Nesse caso, isso não precisa ser feito da mesma forma que o GNU Parallel - desde que toda a saída possa ser canalizada ou armazenada. Eu também gostaria de evitar o uso de arquivos temporários.

Nitrodista
fonte
O GNU Parallel é um único script perl. Estou curioso para saber por que você prefere instalar um script ksh em vez de instalar um único script perl projetado para ter muito poucas dependências. Você pode elaborar sobre isso? (Divulgação: Eu sou o autor do GNU Parallel)
Ole Tange

Respostas:

6

Se você deseja paralelizar em uma máquina com vários núcleos, você pode apenas usar (GNU) xargs, por exemplo:

echo seq_[0-9][0-9].gz | xargs -n 1 -P 16 ./crunching

Significado: xargsinicia até 16 processos paralelamente ao ./crunchinguso de 1 token do stdin para cada processo.

Você também pode usar splitem combinação com xargs.

Ou você pode criar um Makefile simples para execução e chamada de trabalho make -f mymf -j $CORES(você precisa de arquivos temporários para esta solução).

PS: O manual paralelo GNU também inclui algumas comparações com outras ferramentas, incluindo xargs e make , curiosamente elas escrevem:

(Versões muito antigas do paralelo GNU foram implementadas coincidentemente usando make -j).

maxschlepzig
fonte
É importante para o solicitante que "toda a saída possa ser canalizada ou armazenada". xargsé notoriamente ruim nisso quando executado em paralelo porque a saída pode se misturar.
precisa
@maxschlepzig: concordo com sua resposta 100%, sempre uso xargs. Muitas pessoas simplesmente não sabem que o GNU xargs é capaz de fazer paralelo!
JM Becker
0

Veja parallel --embedquais incorporam o GNU Parallel no mesmo script de shell do qual você o usa.

parallel --embed > new_script

depois edite new_script.

Ole Tange
fonte