Wie kann ich den Index des xargs "Parallelprozessors" erhalten?

14

Angenommen, ich habe zwei Ressourcen namens 0und 1, auf die nur exklusiv zugegriffen werden kann.

Gibt es eine Möglichkeit, den "Index" des "Parallelprozessors" wiederherzustellen, der xargsgestartet wird, um ihn als kostenlosen Dienst zum gegenseitigen Ausschluss zu verwenden? Betrachten Sie beispielsweise die folgende parallelisierte Berechnung:

$ 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

Meine Frage ist, ob es ein Zauberwort gibt, etwa indexwie die Ausgabe aussehen würde

$ 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

wo die einzige Garantie ist, dass es immer nur höchstens einen Prozess gibt, der Ressourcen verbraucht 0und für den das gleiche gilt 1. Grundsätzlich möchte ich diesen Index an den untergeordneten Prozess weitergeben, der die Regel einhält, nur die Ressource zu verwenden, der er zugewiesen wurde.

Es wäre natürlich vorzuziehen, dies auf mehr als zwei Ressourcen auszudehnen. Wenn Sie die Dokumente überprüfen, xargskönnen Sie dies wahrscheinlich nicht tun. Gibt es eine äquivalente Mindestlösung? Das Verwenden / Reinigen von Dateien als gefälschte Sperren ist nicht empfehlenswert.

VF1
quelle

Antworten:

18

Wenn Sie GNU-xargs verwenden , gibt es --process-slot-var:

--process-slot-var= Umgebungsvariablenname
Setzen Sie die Umgebungsvariable Umgebungsvariablenname in jedem ausgeführten untergeordneten Prozess auf einen eindeutigen Wert. Jeder Wert ist eine Dezimalzahl. Werte werden wiederverwendet, sobald untergeordnete Prozesse beendet werden. Dies kann beispielsweise in einem rudimentären Lastverteilungsschema verwendet werden.

Also zum Beispiel:

~ 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
quelle