GNU 병렬 타임스탬프 출력

GNU 병렬 타임스탬프 출력

Perl 프로그래머로서 나는 --tagstring을 사용하는 것이 상당히 쉬울 것이라고 생각했지만 기본적으로 Parallel에서 개별적으로 각 작업의 각 출력 줄에 타임스탬프를 찍고 싶습니다. 마찬가지로 올바른 "STUFF" 대체를 사용하면 밀리초 해상도를 가정할 때 출력이 다음과 같이 보일 수 있습니다(나노초 해상도도 괜찮지만).

$ seq 8 | parallel --tags 'sequence {} {=STUFF=}' -j2 'sleep=$((1 + RANDOM % 2)); echo sleeping $sleep; sleep $sleep; echo done; echo $sleep {#} {%} {}'
sequence 1 0.001   sleeping 1
sequence 1 1.001   done
sequence 1 1.002   1 1 1 1
sequence 2 0.001   sleeping 2
sequence 2 2.001   done
sequence 2 2.002   2 2 2 2
sequence 3 0.001   sleeping 2
sequence 3 2.001   done
sequence 3 2.002   2 3 1 3
sequence 5 0.001   sleeping 1
sequence 5 1.001   done
sequence 5 1.002   1 5 1 5
sequence 4 0.001   sleeping 2
sequence 4 2.001   done
sequence 4 2.002   2 4 2 4
sequence 6 0.001   sleeping 1
sequence 6 1.001   done
sequence 6 1.002   1 6 1 6
sequence 7 0.001   sleeping 2
sequence 7 2.001   done
sequence 7 2.002   2 7 2 7
sequence 8 0.001   sleeping 2
sequence 8 2.001   done
sequence 8 2.002   2 8 1 8

답변1

당신은 그것이 쉽다고 생각하는 것에 속을 수도 있고 나는 그것에 대해 당신을 비난할 수 없습니다.

단, 정상적인 출력은 불가능합니다.

이는 토큰 문자열이 두 번만 평가되고 추가만 되기 때문입니다.뒤쪽에작업이 완료되었습니다.

GNU 병렬 실행:

job1 > tmpout1 2> tmperr1
job2 > tmpout2 2> tmperr2
job3 > tmpout3 2> tmperr3

(물론 100% 정확하지는 않지만 충분히 가깝습니다.)

작업이 완료되면 GNU Parallel은 tmp*파일을 청크 단위로 읽고 --tagstring작업 앞에 추가하고 출력합니다.

여기서 중요한 부분은 다음과 같습니다. 태그는아니요달리는 동안 완료되었습니다. 그리고 --tagstring작업이 시작되기 전과 작업이 완료된 후(추가될 최종 결과) 두 번만 계산됩니다.

이 디자인은 태그 문자열 계산이 CPU 집약적이며 출력이 3600000행인 경우 행당 1ms 지연이라도 1시간(!)의 대기 시간이 발생하기 때문에 선택되었습니다.

그러나 한 가지 예외가 있습니다: --line-buffer.

--line-buffer 하다각 출력 라인에 대한 레이블 문자열을 계산합니다. 이 디자인은 이미 더 많은 CPU 시간을 소비하기 때문에 선택되었습니다 --line-buffer(실행 중인 모든 작업에서 새 데이터를 폴링해야 하고 많은 양의 데이터를 처리할 수 없음).

그래서 이것은 작동합니다 :

$ seq 8 | parallel --lb --tagstring 'sequence {} {= $start{$job}||=::now(); $_=sprintf"%06.3f",::now()-$start{$job} =}' -j2 'sleep 1; echo Begin {}; sleep 0.{}; echo End {}'|sort
sequence 1 01.027       Begin 1
sequence 1 01.116       End 1
sequence 2 01.024       Begin 2
sequence 2 01.216       End 2
sequence 3 01.098       Begin 3
sequence 3 01.312       End 3
sequence 4 01.049       Begin 4
sequence 4 01.411       End 4
sequence 5 01.031       Begin 5
sequence 5 01.509       End 5
sequence 6 01.039       Begin 6
sequence 6 01.613       End 6
sequence 7 01.048       Begin 7
sequence 7 01.711       End 7
sequence 8 01.071       Begin 8
sequence 8 01.811       End 8

관련 정보