Як я можу отримати індекс "паралельного процесора" xargs?


14

Припустимо, у мене є два ресурси, названі 0та 1, до яких можна отримати доступ виключно.

Чи є можливість відновити "індекс" "паралельного процесора", який xargsзапускається, щоб використовувати його як безкоштовну службу взаємного виключення? Наприклад, врахуйте наступні паралельні обчислення:

$ 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

Моє запитання - чи існує магічне слово, скажімо index, де виглядатиме результат

$ 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

де єдиною гарантією є те, що існує лише коли-небудь один процес, що використовує ресурс 0і той самий для 1. В основному, я хотів би повідомити цей індекс до дочірнього процесу, який би дотримувався правила використовувати лише той ресурс, про який йому сказали.

Звичайно, бажано було б поширити це на більш ніж два ресурси. Оглядаючи документи, xargsнапевно, цього не можна зробити. Чи є мінімально еквівалентне рішення? Використання / очищення файлів як підроблених блокувань не є кращим.

Відповіді:


19

Якщо ви використовуєте xargs GNU , є --process-slot-var:

--process-slot-var= оточуюча назва
змінної середовища Встановіть унікальне значення змінної середовища оточуючого середовища у кожному запущеному дочірньому процесі. Кожне значення є десятковим цілим числом. Значення повторно використовуються, коли дочірній процес обходиться. Наприклад, це може використовуватися в рудиментарній схемі розподілу навантаження.

Так, наприклад:

~ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.