Come posso ottenere l'indice del "processore parallelo" xargs?


14

Supponiamo di avere due risorse, denominate 0e 1, alle quali è possibile accedere esclusivamente.

Esiste un modo per recuperare l '"indice" del "processore parallelo" che viene xargsavviato per utilizzarlo come servizio gratuito di mutua esclusione? Ad esempio, si consideri il seguente calcolo parallelizzato:

$ 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

La mia domanda è se esiste una parola magica, diciamo index, dove dovrebbe apparire l'output

$ 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

dove l'unica garanzia è che esiste sempre e solo un processo che utilizza risorse 0e lo stesso per 1. Fondamentalmente, vorrei comunicare questo indice fino al processo figlio che rispetterebbe la regola per usare solo la risorsa a cui è stato detto.

Certo, sarebbe preferibile estenderlo a più di due risorse. Ispezionando i documenti, xargsprobabilmente non puoi farlo. Esiste una soluzione minima equivalente? Non è preferibile utilizzare / pulire i file come blocchi falsi.

Risposte:


19

Se stai usando GNU xargs , c'è --process-slot-var:

--process-slot-var= nome-variabile-
ambiente Impostare la variabile -ambiente-nome-variabile-ambiente su un valore univoco in ogni processo figlio in esecuzione. Ogni valore è un numero intero decimale. I valori vengono riutilizzati una volta terminati i processi figlio. Questo può essere usato in uno schema di distribuzione del carico rudimentale, per esempio.

Quindi, per esempio:

~ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.