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

40

Estou confuso sobre a diferença ou vantagem (se houver) de executar um conjunto de tarefas em um .shscript usandoGNU parallel

Por exemplo , a resposta de Ole Tange :

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

em vez de dizer repetindo-os, colocando-os em segundo plano &.

Por exemplo , a resposta de 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 sintática ou praticamente diferentes? E se praticamente diferente, quando devo usar cada um?

Stephen Henderson
fonte

Respostas:

46

Colocar vários trabalhos em segundo plano é uma boa maneira de usar os vários núcleos de uma única máquina. parallelno entanto, permite distribuir trabalhos por vários servidores da sua rede. De man parallel:

O GNU paralelo é uma ferramenta de shell para executar tarefas em paralelo usando um ou mais computadores . A entrada típica é uma lista de arquivos, uma lista de hosts , uma lista de usuários, uma lista de URLs ou uma lista de tabelas.

Mesmo quando executado em um único computador, paralleloferece um controle muito maior sobre como seus trabalhos são paralelos. Veja este exemplo da manpágina:

   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 longo e mais complicado e, mais importante, iniciará o maior número de trabalhos que houver .wavarquivos. Se você executar isso em alguns milhares de arquivos, é provável que um laptop normal fique de joelhos. parallelpor outro lado, lançará um trabalho por núcleo de CPU e manterá tudo agradável e arrumado.

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

O fundo simples realmente não chega nem perto do nível de sofisticação para ser comparado ao paralelo. Quanto à paralleldiferença xargs, a multidão do GNU apresenta um bom colapso aqui . Alguns dos pontos mais salientes são:

  • O xargs lida mal com caracteres especiais (como espaço, 'e ").
  • O xargs pode executar um determinado número de tarefas em paralelo, mas não tem suporte para executar tarefas de número de núcleos de CPU em paralelo.
  • O xargs não tem suporte para agrupar a saída, portanto, a saída pode ser executada em conjunto, por exemplo, a primeira metade de uma linha é de um processo e a última metade da linha é de outro processo.
  • O xargs não tem suporte para manter a ordem da saída, portanto, se executando trabalhos 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.
  • O xargs não tem suporte para substituição de contexto, portanto você terá que criar os argumentos.
terdon
fonte
1
Essa é uma boa resposta, thx. Isso meio que confirma o que eu imaginei. Eu odeio a parallelsintaxe, mais uma nova marca de teclado-faceroll para memorizar. Mas acho que o balanceamento automático entre núcleos / trabalhos vale a pena ...?
Stephen Henderson
3
Dê uma olhada no semque faz parte do pacote GNU Parallel. Isso pode atender melhor aos seus requisitos de sintaxe.
Ole Tange
1
@OleTange thx, good call
Stephen Henderson
> xargs não tem suporte para substituição de contexto, então você terá que criar os argumentos. --- O que isto significa? Não é xargs -I%
raine
4
É verdade que parallelé mais poderoso que xargs, mas essa comparação é bastante tendenciosa. Por exemplo, xargssuporta cadeias terminadas em nulo como entrada para evitar problemas com espaços e aspas e também pode -demular parallel(mesmo mencionado na comparação!). xargs -Ié suficiente substituição de contexto para a maioria dos casos simples, e eu geralmente sei o número de núcleos na máquina. Eu nunca tive um problema com saída desagrupada.
26616 Sam Brightman