상상하다:
$ 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