それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

シェル・スクリプトの同期・並列実行(マルチスレッド処理っぽいこと)

シェル・スクリプトで、マルチスレッド処理っぽく、複数プロセスを起動して、まとめて処理をして処理時間を稼ぎたい。

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備忘録

神戸外国人居留地 - Wikipedia

bashとかでは無理? | okkyの日記 | スラッシュドット・ジャパン

shell - シェルスクリプトで、マルチスレッド処理風実装 - Qiita