Como posso obter o índice do "processador paralelo" do xargs?


14

Suponha que eu tenha dois recursos, nomeados 0e 1, que só podem ser acessados ​​exclusivamente.

Existe alguma maneira de recuperar o "índice" do "processador paralelo" que é xargsiniciado para usá-lo como um serviço de exclusão mútua gratuito? Por exemplo, considere a seguinte computação paralela:

$ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {}"
consuming task 1
consuming task 2
consuming task 3
consuming task 4
consuming task 5
consuming task 6
consuming task 7
consuming task 8

Minha pergunta é se existe uma palavra mágica, digamos index, onde a saída se pareceria

$ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {} with resource index"
consuming task 1 with resource 0
consuming task 2 with resource 1
consuming task 3 with resource 1
consuming task 4 with resource 1
consuming task 5 with resource 0
consuming task 6 with resource 1
consuming task 7 with resource 0
consuming task 8 with resource 0

onde a única garantia é que só existe no máximo um processo usando o 0mesmo recurso para 1. Basicamente, eu gostaria de comunicar esse índice ao processo filho que respeitaria a regra para usar apenas o recurso ao qual foi solicitado.

Obviamente, seria preferível estender isso para mais de dois recursos. Inspecionando os documentos, xargsprovavelmente não é possível fazer isso. Existe uma solução equivalente mínima? Usar / limpar arquivos como bloqueios falsos não é preferível.

Respostas:


18

Se você estiver usando o GNU xargs , há --process-slot-var:

--process-slot-var= environment-variable-name
Defina a variável de ambiente environment-variable-name como um valor exclusivo em cada processo filho em execução. Cada valor é um número inteiro decimal. Os valores são reutilizados quando o processo filho é encerrado. Isso pode ser usado em um esquema de distribuição de carga rudimentar, por exemplo.

Então, por exemplo:

~ echo {1..9} | xargs -n2 -P2 --process-slot-var=index sh -c 'echo "$index" "$@" "$$"' _
0 1 2 10475
1 3 4 10476
1 5 6 10477
0 7 8 10478
1 9 10479
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.