bashで並列処理する方法(xargs)
並列処理とは
通常、意識せずにプログラムを書くと、大体の場合はシングルプロセスの動作をするプログラムになります。
シングルプロセスとは、処理が書かれた順番に実行されていくということです。
シングルプロセスとは別に、マルチプロセスという動作があります。
マルチプロセスとは、イメージてきには、作業レーンが複数ある状態をイメージするのがわかりやすくて、さらにその作業レーンの中でシングルプロセスのプログラムが動く状態です。
現在、コンピュータのプロセッサ(CPU)は、通常マルチコアになっていて、マルチプロセスが動く前提の構造になっています。例えば、ブラウザを開きながら、メモ帳を起動したりなどです。
最近のCPUは1コアあたりの性能よりも、コア数を増やしてトータルで性能を上げる方向性がつよいので、プログラムを高速化しようとすると、大体の場合、シングルプロセスでは行き詰まりが発生してきて、マルチプロセスをどう使ったら早くなるかとかを考えるフェーズがかなりのケースで発生します。
似ている単語でマルチスレッドというものもあるのですが、bashでマルチスレッドをやるのは難しいので、この記事では割愛します。
xargsでマルチプロセスをやる方法
前置きが長くなりましたが、xargsを使うとマルチプロセスをわりと簡単に実装することができるので、簡単な例を使って解説しようとおもいます。
前提として、xargsはいろいろなオプションがあって、シェルスクリプトあるあるですが、使い方も人によってちがうので、他のやり方を否定するものではないです。あくまで例としてみてください。
シングルプロセスの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ cat xargs_test.sh #!/bin/bash function xargs_test(){ ARG1=$1 echo "${ARG1}:1" sleep 3 echo "${ARG1}:2" sleep 3 echo "${ARG1}:3" sleep 3 } export -f xargs_test seq 1 3 | xargs -L 1 -P 1 -I {} bash -c "xargs_test {}" |
処理結果
1 2 3 4 5 6 7 8 9 |
1:1 1:2 1:3 2:1 2:2 2:3 3:1 3:2 3:3 |
コードの解説
functionで3秒ごとにechoする機能を定義しています。
引数で何番目に呼ばれたかをわかるようにしていますが、シンプルな機能実装です。
export -f してますが、これはxargsをつかうと別プロセスで実行することになるので、exportしてあげないと別プロセスからfunctionが見えない状態になるためです。
seq 1 3で、1 2 3の連番をつくりだし、それをxargsに食わせています。
-Lは、1回の実行で使う引数の数です。ほとんどの場合、1を指定しておけば大丈夫です。
-Pは、並列プロセス数です。マルチプロセスをする場合は、2以上にします。
-Iは、パイプで受け取った引数の代名詞を定義します。大体、{}って書いておけばOKです。
今回は、-P 1なので、シングルプロセスの処理となり、処理結果の状態が生まれます。
マルチプロセスの場合
マルチプロセスを行う場合、-Pを2以上にします。
例えば、-P 2とすると以下の結果となります。
1処理目と2処理目が同時に走り、そのあとに3処理目が走っているのがわかります。
2並列の処理結果
1 2 3 4 5 6 7 8 9 |
1:1 2:1 1:2 2:2 1:3 2:3 3:1 3:2 3:3 |
スポンサードリンク
関連記事
-
[bash] cronでログインシェル(.bash_profile)の環境変数などを読み込ませる
こんにちは、今回もメモ。 cronでシェルを実行する際、普通にコマンドを書くと、ログインシェル
-
[bash] bash入門2 - viの使い方・代表的なコマンド一覧
こんにちは、今回はbash入門2としてviエディタの使い方を説明します。 bashの事始めはこ
-
[bash] if文の書き方
if文の書き方をメモります。 ●構文 ※カッコ([])と条件式の間のスペースが無いとエラーに
-
[cron] dateコマンドをcronに書くときの注意点
dateコマンドの引数をcronにそのまま書くと怒られることへのメモ。 そのまま、
-
awkでのgsubを使った文字列置換(正規表現)
まえおき bashなどのシェルスクリプトで、lsした結果とかをつかってファイルを集計したいと
-
[bash] ファイルの中身を1行ずつ処理するループ処理(while文)
ファイルの中身を1行ずつ処理したい場合の処理です。 ファイル名を引数にとります。 #
-
[bash] expr - bashで数値計算を行う方法
bashで数値計算を行う方法です。 exprコマンド自体をで囲んで、変数に代入してあげます。
-
[bash] 文字列長を調べる
bashで変数に入っている文字列長を調べるときは以下のようにする。 ${#変数名} ●実
-
[bash] 文字列の分割(split処理)
bashで文字列をsplitする方法を紹介します。 例えば、以下の文字列をカンマ区切りでspl
-
[bash] grep・egrepコマンド
基本パターン ファイル中の文字列を検索 $ grep '[検索したい文字列]' 検索対象ファ