2017-02-01 21 views
0

私はforループを持っていますので、一度に並列に4回処理したいと思います。 私はページhttps://unix.stackexchange.com/questions/103920/parallelize-a-bash-for-loopから次のコードを試してみました:BASHのNプロセスバッチで並列実行

task(){ 
sleep 0.5; echo "$1"; 
} 
N=4 
(
for thing in a b c d e f g; do 
    ((i=i%N)); ((i++==0)) && wait 
    task "$thing" & 
done 
) 

私は次のように私はそれを得る出力され、test.shとして上記のファイルを格納しています

path$ ./test.sh 
a 
b 
c 
d 
path$ e 
f 
g 

とカーソルが」doesnのを私の端末に戻ってきます。カーソルが私の端末に戻ってきて、なぜ出力 'e'に先行する私のパスがあるのか​​理解できません。 'a'から 'g'まで連続して表示され、コードは停止するはずですか?

+0

そのループが別のループ内ではありませんので、あなたのコードは、一度だけループで7つの物事を行います。しかし、あなたはループを4回処理したいと言いますか?だから、本当に28の処理すべきことはありますか? –

+0

全体のオーダーはどうすればよいですか? a、b、c&dはすべてすべてが終了するまで並行して実行され、e、f、g&aはすべて並行して実行されます。 –

+0

yes @MarkSetchellすべてが終了するまで並行して実行する、b、c&dはすべて並行して実行します。 – pku

答えて

0

Enterを押すと、通常のシェルよりもtoyが見えます。あなたが終了する前にバッチプロセスを待ちたい場合は、スクリプトは単にスクリプト

+0

ありがとうございますが、なぜ私は必要なのでしょうか?コードの完成時にそれ自身で戻るのではなく、通常のシェルに戻るためにenterを押すことができます。また、「スクリプトを終了する前にバッチ処理を待つ場合は、スクリプトの最後に待機を追加するだけです」 – pku

+0

プロンプト 'path $'が表示されます。これは、スクリプトよりも早く終了します。あなたは殻に入っています。 'wait'は現在のシェルバックグラウンドプロセスでrunnedを待つよりもbashコマンドです。 –

+0

私は 'path $ e'行を見るとコードが終了しましたが、遅れて印刷されているだけですか? – pku

2

の最後にwaitを追加それはあなたが望むものを理解することはかなり難しいですが、私はあなたがaと呼ばれる7つの物事、bcをしたいと思います。.. gを並行して、一度に4つまでです。

もしそうなら、あなたはこれを試みることができる:

としてシェルに1つの文字( -n1)を渡す手紙 a ...その後、各文字のための新しい bashシェルを起動 xargsgを、送信
echo {a..g} | xargs -P4 -n1 bash -c 'echo "$1"; sleep 2}' {} 

{}bashシェルは、パラメータ(最初のパラメータは$1)を取得し、終了するまで2秒間待っているので、一時停止を見ることができます。

-P4は、bashの4つのインスタンスを一度に並行して実行するように指示します。

ここでは、その動画を実行しています。最初のものは-P4を使用し、4のグループで動作し、第二の配列は-P2を使用し、一度に2を行います。

enter image description here


それとも、もっと簡単に、あなたが支出を気にしない場合は10秒GNUをインストールするパラレル:

parallel -j4 -k 'echo {}; sleep 2' ::: {a..g} 
+0

解決策ありがとうございますが、コマンドラインソリューションがこのケースで可能なので、コマンドラインソリューションを提供する代わりに上記の私のコードを編集することができたら本当に好きですが、実際には私のtask()関数はもっと多くのものを持っています – pku

+0

'export -f task'を実行して' task() 'をエクスポートしてから' parallel ... task'を実行するだけです –

関連する問題