GNU parallelをインストールせずに並列実行を実現したかったので、そのとき作ったShellのメモ
ちなみにGNU parallelを使った場合はこんなかんじ
% time parallel -j 2 {} << EOF
echo 1;sleep 5;
echo 2;sleep 5;
EOF
1
2
parallel -j 2 {} <<<' echo 1;sleep 5; echo 2;sleep 5;' 0.22s user 0.23s system 8% cpu 5.500 total
処理部分
CPU_CORE=2
parallel_exec () {
for i in "$@"; do echo $i; done | xargs -I{} -P ${CPU_CORE} sh -c {}
}
使用方法
parallel_exec "コマンド1" "コマンド2"
使用例
$ parallel_exec "echo hoge" "echo foo"
hoge
foo
実行時間計測結果
$ time parallel_exec "sleep 3; echo hoge" "sleep 1; echo foo"
foo
hoge
real 0m3.021s
user 0m0.011s
sys 0m0.014s
sleep 1の foo が先に出力され、全体の実行時間も約3秒なので期待通り。
エラー時の挙動
ちなみにスクリプト中のコマンドでエラーが発生すると parallel_exec 自体もエラーコードを返してくれる
$ parallel_exec "sleep 3; exit 0" "sleep 1; exit 1"
$ echo $?
1