0
と1
という名前の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
はおそらくこれを行うことができません。同等の最小限のソリューションはありますか?偽のロックとしてファイルを使用/クリーニングすることは好ましくありません。
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