web-dev-qa-db-ja.com

xargs「並列プロセッサ」のインデックスを取得するにはどうすればよいですか?

01という名前の2つのリソースがあり、これらは排他的にのみアクセスできるとします。

無料の相互排除サービスとして使用するために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つだけであり、1でも同じであることです。基本的に、私はこのインデックスを、伝えられたリソースのみを使用するというルールを尊重する子プロセスに伝えたいと思います。

もちろん、これを3つ以上のリソースに拡張することをお勧めします。ドキュメントを検査すると、xargsはおそらくこれを行うことができません。同等の最小限のソリューションはありますか?偽のロックとしてファイルを使用/クリーニングすることは好ましくありません。

14
VF1

GNU xargs を使用している場合は、--process-slot-var

--process-slot-var =環境変数名
実行中の各子プロセスで、環境変数environment-variable-nameを一意の値に設定します。各値は10進整数です。子プロセスが終了すると、値が再利用されます。これは、たとえば、基本的な負荷分散スキームで使用できます。

したがって、たとえば:

~ 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
19
muru