Paralelo GNU vs & (quero dizer fundo) vs xargs -P

35

Estou confuso sobre a diferença ou vantagem (se houver) de executar um conjunto de tarefas em um script .sh usando GNU parallel

Por exemplo Resposta do Ole Tange :

parallel ./pngout -s0 {} R{} ::: *.png

em vez de dizer loop por meio deles, colocando-os no plano de fundo & .

Por exemplo frostschutz :

#copied from the link for illustration
for stuff in things
do
( something
  with
  stuff ) &
done
wait # for all the something with stuff

Em suma, eles são apenas sintaticamente ou praticamente diferentes? E se praticamente diferente quando devo usar cada um?

    
por Stephen Henderson 12.12.2013 / 01:08

1 resposta

41

Colocar vários trabalhos em segundo plano é uma boa maneira de usar os vários núcleos de uma única máquina. O parallel , no entanto, permite que você distribua trabalhos em vários servidores da sua rede. De man parallel :

GNU parallel is a shell tool for executing jobs in parallel using one or more computers. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables.

Mesmo quando executado em um único computador, parallel oferece muito mais controle sobre como seus trabalhos são paralelizados. Veja este exemplo na página man :

   To convert *.wav to *.mp3 using LAME running one process per CPU core
   run:

   parallel lame {} -o {.}.mp3 ::: *.wav

OK, você poderia fazer o mesmo com

   for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done

No entanto, isso é mais demorado e complicado e, o que é mais importante, será lançado em quantos trabalhos houver .wav de arquivos. Se você executar isso em alguns milhares de arquivos, é provável que coloque um laptop normal de joelhos. parallel , por outro lado, lançará um trabalho por núcleo de CPU e manterá tudo limpo e organizado.

Basicamente, parallel oferece a você a capacidade de ajustar como seus trabalhos são executados e a quantidade de recursos disponíveis que eles devem usar. Se você realmente quiser ver o poder dessa ferramenta, acesse o manual ou, no mínimo, , os exemplos que oferece.

O background simples realmente não chega nem perto do nível de sofisticação que deve ser comparado ao paralelo. Quanto a como parallel difere de xargs , a turma GNU oferece um bom resumo aqui . Alguns dos pontos mais importantes são:

  • xargs lida mal com caracteres especiais (como espaço, 'e ").
  • xargs pode executar um determinado número de tarefas em paralelo, mas não tem suporte para executar jobs de número-de-núcleos-cpu em paralelo.
  • xargs não tem suporte para agrupar a saída, portanto, a saída pode ser executada junto, por exemplo a primeira metade de uma linha é de um processo e a última metade da linha é de outro processo.
  • xargs não tem suporte para manter a ordem da saída, portanto, se executar tarefas em paralelo usando xargs, a saída do segundo trabalho não poderá ser adiada até que o primeiro trabalho seja concluído.
  • O xargs não tem suporte para executar tarefas em computadores remotos.
  • xargs não tem suporte para substituição de contexto, portanto, você terá que criar os argumentos.
por 12.12.2013 / 05:09