転載・引用について

ユーザ用ツール

サイト用ツール


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

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

  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が終了したら渡された引数を出力する

という作業。

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

  • シリアルに実行したら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にもこの引数を取り入れてほしい…

このウェブサイトはクッキーを使用しています。 Webサイトを使用することで、あなたはあなたのコンピュータにクッキーを保存することに同意します。 また、あなたはあなたが私たちのプライバシーポリシーを読んで理解したことを認めます。 同意しない場合はウェブサイトを離れてください。クッキーに関する詳細情報
tweet/2018/0605_01.txt · 最終更新: 2018/06/05 13:16 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki