web-dev-qa-db-ja.com

Bashでのマルチスレッド

シェルスクリプトにマルチスレッド機能を導入したいと思います。

関数read_cfg()を異なる引数で呼び出すスクリプトがあります。これらの各関数呼び出しは独立しています。

これらの関数呼び出し(スクリプトではなく)を並行してインスタンス化できますか?どうすればそれを達成できますか?

72
Kiran

もちろん、コマンドの後に&を追加するだけです:

read_cfg cfgA &
read_cfg cfgB &
read_cfg cfgC &
wait

これらのジョブはすべて、バックグラウンドで同時に実行されます。オプションのwaitコマンドは、すべてのジョブが完了するまで待機します。

各コマンドは個別のプロセスで実行されるため、技術的には「マルチスレッド」ではありませんが、問題は解決すると考えています。

156
Martin

スクリプトの複数のコピーを並行して実行できます。各コピーは、異なる入力データ用です。 4つのコアですべての* .cfgファイルを処理するには:

    ls *.cfg | xargs -P 4 -n 1 read_cfg.sh

Read_cfg.shスクリプトは、1つのパラメーターのみを取ります(-nで強制されます)

23
tnorgd

Bashジョブ制御には、複数のスレッドではなく、複数のプロセスが含まれます。

&サフィックスを使用して、バックグラウンドでコマンドを実行できます。

waitコマンドを使用して、バックグラウンドコマンドの完了を待つことができます。

|で区切ることにより、複数のコマンドを並行して実行できます。 |の左側のコマンドの標準出力は右側のコマンドの標準入力に接続されているため、これは同期メカニズムも提供します。

21
mouviciel