tweet:2018:0605_01
shellでMultiProcess
目から鱗だったので。
POSIX主義者としてはちょっとアレではあるのだが、それでもあまりにも便利だったのでメモらずにはいられない。
結論
xargs -P
は神。
- 神を召喚するのは、おまじないが必要
-P
拡張されているxargs
- -Pをうまく使うには、-nか-Lが必要
- -nの方がshell scriptとしては簡単かもしれないけど、ケースバイケース
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
何をしているのか?というと、
- “2 3 4 1 2 3 4 1 2 3 4 1” という文字列を
- xargs に渡して
- 渡された文字列を1つずつ分離(
-n 1
) し、実行させたいコマンドの%
の部分に投入(-I %
)し、3プロセスずつ実行(-P 3
)させる。 - xargsが実行するのは、渡された引数を文字列から数値に変換(
$((%))
)し、sleepの引数に渡し、sleepが終了したら渡された引数を出力する
という作業。
あとはパズルなので、ちゃんと考えればわかると思うが一応
- シリアルに実行したら
2 3 4 1 2 3 4 1 2 3 4 1
の順になる。 - このスクリプトだと、
2 3 1 4 2 3 1 4 2 3 1 4
の順になる。
これは、xargsが「プロセスの終了を待って」、「プロセスごとにどんどん-P
の引数分だけ」処理を開始させることを意味している。
つまり、疑似マルチタスクを実行することができるということになる。
感想
POSIXにもこの引数を取り入れてほしい…
tweet/2018/0605_01.txt · 最終更新: 2018/06/05 13:16 by 127.0.0.1