xargs "パラレルプロセッサ"のインデックスを取得するには?

xargs

排他的にアクセスできるという02つのリソースがあるとします。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

唯一の保証は、最大1つのプロセスがリソースを0使用することです1。基本的に私はこのインデックスを子プロセスに渡したいと思います。子プロセスは、表示されたリソースのみを使用するという規則に従います。

もちろん、これを複数のリソースに拡張することをお勧めします。文書を確認してみることxargsはできません。最小限に等価なソリューションはありますか?ファイルを偽のロックとして使用/整理することは望ましくありません。

ベストアンサー1

使用する場合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

おすすめ記事