目次

shellでMultiProcess

目から鱗だったので。

POSIX主義者としてはちょっとアレではあるのだが、それでもあまりにも便利だったのでメモらずにはいられない。

結論

xargs -Pは神。

Sample

ためしてみた。これは、ちょっと試すためなので、bashを使った。 bashの数値計算拡張が一番簡単だったので。

echo 2 3 4 1 2 3 4 1 2 3 4 1 | xargs -n 1 -P 3 -I % sh -c 'sleep $((%)); echo "%" '
2
3
1
4
2
3
1
4
2
3
1
4

何をしているのか?というと、

  1. “2 3 4 1 2 3 4 1 2 3 4 1” という文字列を
  2. xargs に渡して
  3. 渡された文字列を1つずつ分離(-n 1) し、実行させたいコマンドの % の部分に投入(-I %)し、3プロセスずつ実行(-P 3)させる。
  4. xargsが実行するのは、渡された引数を文字列から数値に変換($((%)))し、sleepの引数に渡し、sleepが終了したら渡された引数を出力する

という作業。

あとはパズルなので、ちゃんと考えればわかると思うが一応

これは、xargsが「プロセスの終了を待って」、「プロセスごとにどんどん-Pの引数分だけ」処理を開始させることを意味している。 つまり、疑似マルチタスクを実行することができるということになる。

感想

POSIXにもこの引数を取り入れてほしい…