ux00ffの日記

2012-07-30

シェルスクリプトのみで xargs を利用した同時実行数の制御

あんまり「並行処理」に xargs を使うイメージはなかったけど、やってみたらけっこう便利だったのでメモ。

xargs の -P とか -n とかのオプションを利用することで、手軽に同時実行数を指定した並列処理をスクリプト内で実現できる。
小さなものであれば、特別なライブラリを導入したり、個別に perl などでマルチスレッドプログラミングする必要はなさそうです。すごい。

# 別のスクリプトの出力を処理する
pre_process.sh | xargs -n 1 -P 2 ./post_process.sh

# ファイルから読み込む
cat target_list.txt | xargs -n 1 -P 2 ./process.sh

# 決まったデータを順に処理する
(for DATA in a b c d e f; do echo $DATA ;done) | xargs -n 1 -P 2 ./parallel.sh

もちろん万能ではなくて、けっこう融通の利かない方法ではあると思います。

  • GNU Parallels ほどきめ細かいコントロールはできない。
  • コマンド実行の多重度なので、プロセス起動・終了のオーバーヘッドがある。マルチスレッドほど軽量じゃない。
  • bash関数と組み合わせるといったことがちょっとやりづらい。(xargs 的に)
  • xargs の引数の書き方すぐ忘れる。test 並。

でもまあ、「時間のかかるバックグラウンドタスクをざくざく立ち上げて処理したいが、同時実行数は制限したい」といった限定的な用途にはジャストフィットするのではないでしょうか。

参考資料

このあたりを参考にしました。多謝。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ux00ff/20120730/1343655384
リンク元