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


14

私は2つのリソース、という名前があると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つだけであり、同じことです1。基本的に、このインデックスを、通知されたリソースのみを使用するルールを尊重する子プロセスに伝えたいと思います。

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

回答:


18

あなたが使用している場合はGNU xargsのを、あります--process-slot-var

--process-slot-var= 環境変数名
環境変数環境変数名を、実行中の各子プロセスで一意の値に設定します。各値は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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.