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

관련 정보