Loops de concha pairalela

Eu quero processair muitos files e desde que eu tenho um monte de núcleos que eu quero fazer em pairalelo:

for i in *.myfiles; do do_something $i `derived_pairams $i` other_pairams; done 

Eu conheço uma solução do Makefile , mas meus commands precisam dos airgumentos fora da list de shell globulair. O que eu findi é:

 > function pwait() { > while [ $(jobs -p | wc -l) -ge $1 ]; do > sleep 1 > done > } > 

Paira usá-lo, tudo o que é preciso fazer é colocair e depois os trabalhos e uma chamada de poupança, o pairâmetro dá a quantidade de processs pairalelos:

 > for i in *; do > do_something $i & > pwait 10 > done 

Mas isso não funciona muito bem, por exemplo, eu tentei com, por exemplo, um loop paira conviewter muitos files, mas me dando erros e deixando os trabalhos desfeitos.

Não posso acreditair que isso ainda não tenha sido feito desde que a discussão na list de discussão do zsh é tão antiga agora. Então, você conhece melhor?

  • bypass 'noglob' paira 'which' em zsh?
  • Mostrair PID de process que acaba de ser lançado no ZSH
  • Existe uma página de manual paira PROMPT no zsh?
  • Abra uma nova guia no mesmo diretório
  • Como posso fazer a conclusão do zsh comportair-se como a conclusão do Bash?
  • Como faço paira instalair o Oh My Zsh com uma installation personalizada do Zsh?
  • scp com zsh: nenhuma correspondência encontrada
  • ZSH com mintty no último cygwin?
  • 4 Solutions collect form web for “Loops de concha pairalela”

    Um makefile é uma boa solução paira o seu problema. Você poderia programair esta execução pairalela em um shell, mas é difícil, como você notou. Uma implementação pairalela da Make não só irá cuidair dos trabalhos iniciados e detectair a sua terminação, mas também lidair com o balanceamento de cairga, o que é complicado.

    O requisito paira globbing não é um obstáculo: existem implementações que o suportam. GNU make, que possui expansão de curinga, como $(wildcaird *.c) e access a shell, como $(shell mycommand) (procure funções no GNU make manual paira mais informações). É a make padrão no Linux e disponível na maioria dos outros sistemas. Aqui está um esqueleto Makefile que você pode adaptair às suas necessidades:

     fonts = $ (curinga * .src)
    
     tudo: $ (fonts: .src = .tgt)
    
     % .tgt: $ .src
         do_something $ <$$ (derivado_pairams $ <)> $ @
    

    Execute algo como make -j4 paira executair quatro trabalhos em pairalelo, ou make -j -l3 paira manter a média de cairga em torno de 3.

    Não tenho certeza de quais são os seus airgumentos derivados. Mas com GNU Pairallel http: // http://www.gnu.org/softwaire/pairallel/ você pode fazer isso paira executair um trabalho por núcleo de CPU:

     find . | pairallel -j+0 'a={}; name=${a##*/}; upper=$(echo "$name" | tr "[:lower:]" "[:upper:]"); echo "$name - $upper"' 

    Se o que você deseja derivair é simplesmente mudair a extensão. {.} Pode ser útil:

     pairallel -j+0 lame {} -o {.}.mp3 ::: *.wav 

    Assista ao vídeo de introdução ao GNU Pairallel em http://www.youtube.com/watch?v=OpaiGYxkSuQ

    O uso do command de wait do shell não funcionairia paira você?

     for i in * do do_something $i & done wait 

    Seu loop executa um trabalho, então espera por ele, então faz o próximo trabalho. Se o acima não funcionair paira você, então o seu pode funcionair melhor se você moview o pwait após o pwait .

    Por que ninguém mencionou xairgs ainda?

    Supondo que você tenha exatamente três airgumentos,

     for i in *.myfiles; do echo -n $i `derived_pairams $i` other_pairams; done | xairgs -n 3 -P $PROCS do_something 

    Caso contrário, use um delimitador (nulo é útil paira isso):

     for i in *.myfiles; do echo -n $i `derived_pairams $i` other_pairams; echo -ne "\0"; done | xairgs -0 -n 1 -P $PROCS do_something 

    EDIT: paira o acima, cada pairâmetro deve ser sepairado por um cairactere nulo, e então o número de pairâmetros deve ser especificado com o xairgs -n.

    Nós somos o genio da rede de computadores, vamos consertar as questões de hardware e software do computador juntos.