2011年11月10日木曜日

xargsを利用して処理を並列的に実行させる

このエントリーをはてなブックマークに追加
xargsは標準入力から引数を読み込んで、指定コマンドを実行するコマンドです。このコマンドをうまく利用すると、コマンド処理を並列的に実行させることができるようです。ここでは、処理を並列実行させるためのメモを記述しています。



並列処理の実装
例として、2、3、5、7、11秒間スリープする5つの処理を考えます。まず、これらの時間が書かれたリスト(time.list)と、引数で指定された秒数だけスリープするシェル(sleep.sh)を用意しました。

time.list
2
3
5
7
11

sleep.sh
#!/bin/sh

DATE=`date +%H:%M:%S`;
echo $DATE sleep $1 start
sleep $1
DATE=`date +%H:%M:%S`;
echo $DATE sleep $1 end

time.listから時間を読み込み、xargsを利用してそれらの時間を引数としてsleepシェルに渡すコマンドを次のように書きました。

コマンド例
cat time.list | xargs -P2 -I SLEEP_TIME sleep.sh SLEEP_TIME

-Pは実行数を決めるオプションで、指定された数だけのコマンドを並列実行させます。-P2と指定すると、最大で2コマンドを並列に処理します。

-Iは引数の置き換えを意味します。例では、cat time.listで出力された値をSLEEP_TIMEに置き換えています。


実行結果
上記コマンド例の実行数を2と3にして実行した結果はそれぞれ次の通りになりました。

実行数2(-P2)の実行結果
20:49:00 sleep 2 start
20:49:00 sleep 3 start
20:49:02 sleep 2 end
20:49:02 sleep 5 start
20:49:03 sleep 3 end
20:49:03 sleep 7 start
20:49:07 sleep 5 end
20:49:07 sleep 11 start
20:49:10 sleep 7 end
20:49:18 sleep 11 end

実行数3(-P3)の実行結果
20:49:52 sleep 3 start
20:49:52 sleep 5 start
20:49:52 sleep 2 start
20:49:54 sleep 2 end
20:49:54 sleep 7 start
20:49:55 sleep 3 end
20:49:55 sleep 11 start
20:49:57 sleep 5 end
20:50:01 sleep 7 end
20:50:06 sleep 11 end

実行数2では、まず2秒と3秒のスリープが同時に開始され、2秒後に5秒のスリープ、3秒後に7秒のスリープが開始されました。そして、5秒のスリープが終わったタイミングで11秒のスリープが開始されました。

実行数3では、まず2、3、5秒のスリープが同時に実行され、2秒後に7秒のスリープ、3秒後に11秒のスリープが開始されました。


参考:xargsコマンドを使って指定したコマンドを並列実行させる

0 件のコメント:

コメントを投稿