想像する:
$ cat libs.txt
lib.a
lib1.a
$ cat t1a.sh
f1()
{
local lib=$1
stdbuf -o0 printf "job for $lib started\n"
sleep 2
stdbuf -o0 printf "job for $lib done\n"
}
export -f f1
cat libs.txt | SHELL=$(type -p bash) parallel --jobs 2 f1
呼び出しと出力:
$ time bash t1a.sh
job for lib.a started
job for lib.a done
job for lib1.a started
job for lib1.a done
real 0m2.129s
user 0m0.117s
sys 0m0.033s
ここで見ることができる実行はf1
実際には並列(real 0m2.129s
)です。
しかし、診断出力は実行が続くように見えます。
次の診断結果が出ると予想されます。
job for lib.a started
job for lib1.a started
job for lib.a done
job for lib1.a done
診断出力が並列実行ではなく順次実行のように見えるのはなぜですか?
並列実行のように見えるように診断出力を変更するにはどうすればよいですか?
答え1
マニュアルページから牛に似た一種の栄養parallel
:
--group
グループ出力。
各ジョブの出力は一緒にグループ化され、コマンドが完了したときにのみ印刷されます。最初のものはStdout(標準出力)、次はstderr(標準エラー)です。
各ジョブには約0.5ミリ秒のCPU時間がかかり、より大きな出力の場合はディスク速度に依存します。
--group
デフォルトです。また見なさい:
--line-buffer
--ungroup
--tag
[...]
--line-buffer
--lb
ラインベースのバッファリングされた出力。
--group
ジョブ全体にわたって出力を一緒に保持します。--ungroup
あるジョブの行の半分と別のジョブの行の半分を混合して出力できます。--line-buffer
その間にあります:GNUパラレルは行全体を印刷しますが、さまざまな作業を混在させることができる生産ライン。
したがって、好みの動作に応じてコマンドに--line-buffer
orを追加する必要があります。--ungroup
parallel
$ grep parallel t1a.sh
cat libs.txt | SHELL=$(type -p bash) parallel --line-buffer --jobs 2 f1
$ bash t1a.sh
job for lib.a started
job for lib1.a started
job for lib.a done
job for lib1.a done