シェルスクリプトにマルチスレッド機能を導入したいと思います。
関数read_cfg()
を異なる引数で呼び出すスクリプトがあります。これらの各関数呼び出しは独立しています。
これらの関数呼び出し(スクリプトではなく)を並行してインスタンス化できますか?どうすればそれを達成できますか?
もちろん、コマンドの後に&
を追加するだけです:
read_cfg cfgA &
read_cfg cfgB &
read_cfg cfgC &
wait
これらのジョブはすべて、バックグラウンドで同時に実行されます。オプションのwait
コマンドは、すべてのジョブが完了するまで待機します。
各コマンドは個別のプロセスで実行されるため、技術的には「マルチスレッド」ではありませんが、問題は解決すると考えています。
スクリプトの複数のコピーを並行して実行できます。各コピーは、異なる入力データ用です。 4つのコアですべての* .cfgファイルを処理するには:
ls *.cfg | xargs -P 4 -n 1 read_cfg.sh
Read_cfg.shスクリプトは、1つのパラメーターのみを取ります(-nで強制されます)
Bashジョブ制御には、複数のスレッドではなく、複数のプロセスが含まれます。
&
サフィックスを使用して、バックグラウンドでコマンドを実行できます。
wait
コマンドを使用して、バックグラウンドコマンドの完了を待つことができます。
|
で区切ることにより、複数のコマンドを並行して実行できます。 |
の左側のコマンドの標準出力は右側のコマンドの標準入力に接続されているため、これは同期メカニズムも提供します。