Como posso obter o índice do xargs “processador paralelo”?

10

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

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

$ 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

A minha pergunta é se existe uma palavra mágica, digamos index , onde a saída seria semelhante a

$ 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

em que a única garantia é que, no máximo, só haverá um processo usando o recurso 0 e o mesmo para 1 . Basicamente, gostaria de comunicar esse índice ao processo filho que respeitaria a regra para usar somente o recurso para o qual foi contado.

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

    
por VF1 12.06.2018 / 04:57

1 resposta

15

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

--process-slot-var=environment-variable-name
Set the environment variable environment-variable-name to a unique value in each running child process. Each value is a decimal integer. Values are reused once child processes exit. This can be used in a rudimentary load distribution scheme, for example.

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
    
por 12.06.2018 / 05:07