Comment obtenir l'index du «processeur parallèle» xargs?

14

Supposons que j'ai deux ressources, nommées 0et 1, qui ne sont accessibles qu'en exclusivité.

Existe-t-il un moyen de récupérer l '"index" du "processeur parallèle" qui se xargslance afin de l'utiliser comme un service d'exclusion mutuelle gratuit? Par exemple, considérons le calcul parallélisé suivant:

$ 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

Ma question est de savoir s'il existe un mot magique, disons index, où la sortie ressemblerait

$ 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

où la seule garantie est qu'il n'y a qu'un seul processus au plus utilisant la 0même ressource et pour 1. Fondamentalement, j'aimerais communiquer cet index au processus enfant qui respecterait la règle pour utiliser uniquement la ressource à laquelle il a été dit.

Bien sûr, il serait préférable d'étendre cela à plus de deux ressources. Inspecter les documents, xargsne peut probablement pas le faire. Existe-t-il une solution équivalente minimale? L'utilisation / le nettoyage de fichiers comme de faux verrous n'est pas préférable.

VF1
la source

Réponses:

19

Si vous utilisez GNU xargs , il y a --process-slot-var:

--process-slot-var= nom-variable-
environnement Définissez la variable d' environnement nom-variable-environnement sur une valeur unique dans chaque processus enfant en cours d'exécution. Chaque valeur est un entier décimal. Les valeurs sont réutilisées une fois les processus enfants terminés. Cela peut être utilisé dans un schéma de distribution de charge rudimentaire, par exemple.

Ainsi, par exemple:

~ 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
la source