GNU並列:診断出力が並列実行ではなく順次実行のように見えるのはなぜですか?

GNU並列:診断出力が並列実行ではなく順次実行のように見えるのはなぜですか?

想像する:

$ 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-bufferorを追加する必要があります。--ungroupparallel

$ 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

おすすめ記事