並列処理の実装
例として、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 件のコメント:
コメントを投稿