シェル・スクリプトで、マルチスレッド処理っぽく、複数プロセスを起動して、まとめて処理をして処理時間を稼ぎたい。
wait コマンド
複数プロセスを起動してバックグラウンドに回し、wait で処理終了を待つことが出来る
convet *.png out.jpg #なに手を加えない場合
バックグラウンドで大量に起動して処理を待つ
for i in *.png ; do convert $i $i.jpg & ; done wait
wait をすると、複数起動したバックグラウンド・ジョブをすべて待つことが出来ます。
同時実行制御
CONCURRENT_COUNT=3 NUM_PROCESS=0 for name in *.png ; do NUM_PROCESS=NUM_PROCESS+1 convert $name $name.jpg & if ( ( $NUM_PROCESS >= $CONCURRENT_COUNT ) ) ; then wait NUM_PROCESS=0; fi done; wait;
単純に、3つ起動して3つ待つことが出来ます。
ただし、3つ起動して3つの終了を待ってから、次の3つを起動をする。
なので、マルチスレッドのような3つのワーカーが次々と処理をしている実装になる。 が、独立して3つがずっと働いているようにはならない。
wait は同時実行制御
もっと簡単な並列実行制御
ただし、*.jpg のような処理はxargs を使った方がらく
find . -type f -name '*.jpg' | xargs -P 3 -I@ convert @ @.jpg;
xargs 最強ですね。
参考資料
並列実行はxargsコマンドを使うと楽ちん高速化ですね。 - それマグで!
端末のシェル(bash,dash,zsh,csh系)におけるwaitコマンドについて - 試験運用中なLinux備忘録