명령줄 옵션 없이 GNU Parallel을 사용하면 마지막 인수가 STDIN 줄에 의해 결정되는 명령을 쉽게 병렬화할 수 있습니다.
$ seq 3 | parallel echo
2
1
3
parallel
작업을 시작하기 전에 STDIN에서 EOF를 기다리지 않는다는 점에 유의하십시오 . 실행은 즉시 yes | parallel echo
무한한 수의 사본 인쇄를 시작합니다.y
그러나 STDIN이 상대적으로 짧으면 이 동작이 변경되는 것 같습니다.
$ { yes | ghead -n5; sleep 10; } | parallel echo
sleep 10
이 경우 완료될 때까지 출력이 반환되지 않습니다.
이것은 단지 참고 사항입니다. 실제로 지속적으로 생성되는 일련의 FIFO 파이프에서 데이터를 읽으려고 합니다. 여기서 FIFO 생성 프로세스는 기존 파이프가 소비되기 시작할 때까지 계속되지 않습니다. 예를 들어 내 명령은 다음과 같은 STDOUT 스트림을 생성합니다.
/var/folders/2b/1g_lwstd5770s29xrzt0bw1m0000gn/T/tmp.PFcggGR55i
/var/folders/2b/1g_lwstd5770s29xrzt0bw1m0000gn/T/tmp.UCpTBzI3J6
/var/folders/2b/1g_lwstd5770s29xrzt0bw1m0000gn/T/tmp.r2EmSLW0t9
/var/folders/2b/1g_lwstd5770s29xrzt0bw1m0000gn/T/tmp.5TRNeeZLmt
cat
새 터미널에서 이러한 각 파일을 한 번에 하나씩 수동으로 생성하면 FIFO 생성 프로세스가 성공적으로 완료됩니다. 그러나 실행이 printfifos | parallel cat
작동하지 않습니다. 대신 parallel
STDIN에 대한 입력을 영원히 기다리는 것을 차단하는 것 같습니다. 파이프를 수정하면 printfifos | head -n4 | parallel cat
교착 상태가 사라지고 처음 4개의 파이프가 성공적으로 인쇄됩니다.
이 동작은 매개변수와 관련된 것 같습니다 --jobs|-j
. { yes | ghead -n5; sleep 10; } | parallel cat
10초 동안 출력이 생성되지 않지만 옵션을 추가하면 4 -j1
개의 라인이 생성된 y
다음 거의 즉시 최종 y
.모든parallel
EOF를 얻기 위해 STDIN을 읽어 이전에 처리할 매개변수를 얻을 수 있다. 이것을 달성할 수 있는 방법이 있나요?
답변1
GNU Parallel의 버그는 작업 슬롯당 하나의 작업을 읽은 후에만 처리를 시작한다는 것입니다. 그런 다음 한 번에 하나의 작업을 읽습니다.
이전 버전에서는 작업 슬롯 수에 따라 출력도 지연되었습니다. 최신 버전에서는 단일 작업의 출력만 지연됩니다.
따라서 매초마다 하나의 작업을 보내면 parallel -j10
시작하기 전에 10개의 작업을 읽게 됩니다. 이전 버전에서는 작업 3의 출력을 보려면 추가로 10초를 기다려야 했습니다.
시작 시간 제한에 대한 해결책은 병렬 처리를 위해 작업 슬롯당 더미 작업을 제공하는 것입니다.
true >jobqueue; tail -n+0 -f jobqueue | parallel &
seq $(parallel --number-of-threads) | parallel -N0 echo true >> jobqueue
# now add the real jobs to jobqueue
사용할 솔루션을 출력합니다 --linebuffer
(그러나 이는 다른 작업의 전체 라인을 혼합합니다).