Как я могу получить индекс 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вероятно, не могу этого сделать. Есть ли минимальное эквивалентное решение? Использование / очистка файлов в качестве поддельных блокировок не является предпочтительным.

VF1
источник

Ответы:

19

Если вы используете GNU xargs , есть --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
Мур
источник