Jak mogę uzyskać indeks „procesora równoległego” xargs?

14

Załóżmy, że mam dwa zasoby, o nazwie 0i 1, do których można uzyskać dostęp wyłącznie.

Czy jest jakiś sposób na odzyskanie „indeksu” „procesora równoległego”, który xargsuruchamia się w celu wykorzystania go jako bezpłatnej usługi wzajemnego wykluczania? Np. Rozważ następujące obliczenia równoległe:

$ 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

Moje pytanie brzmi, czy istnieje magiczne słowo, powiedzmy index, gdzie wyglądałoby wyjście

$ 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

gdzie jedyną gwarancją jest to, że istnieje tylko jeden proces wykorzystujący zasoby 0i taki sam dla 1. Zasadniczo chciałbym przekazać ten indeks do procesu potomnego, który przestrzegałby reguły, aby używać tylko zasobu, do którego została skierowana.

Oczywiście lepiej byłoby rozszerzyć to na więcej niż dwa zasoby. Sprawdzanie dokumentów, xargsprawdopodobnie nie może tego zrobić. Czy istnieje minimalne równoważne rozwiązanie? Używanie / czyszczenie plików jako fałszywych zamków nie jest zalecane.

VF1
źródło

Odpowiedzi:

19

Jeśli używasz GNU xargs , istnieją --process-slot-var:

--process-slot-var= nazwa-zmiennej-
środowiska Ustaw zmienną środowiskową-nazwa-zmiennej na unikalną wartość w każdym uruchomionym procesie potomnym. Każda wartość jest liczbą dziesiętną. Wartości są ponownie wykorzystywane po zakończeniu przetwarzania przez dziecko. Można to wykorzystać na przykład w podstawowym rozkładzie obciążenia.

Na przykład:

~ 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
muru
źródło