cat
내가 본 것을 차단했습니다.암호read()
즉, 차단을 사용한 다음 차단을 사용합니다 write()
.
모든 표준 출력 버퍼링이 목적에 따라 비활성화된 일부 도구를 호출하고 싶습니다(예: 설명된 대로).여기), 도구가 하위 프로세스를 호출할 수 있고 동시에 작성되는 경우 모든 하위 프로세스에 의한 stdout의 모든 쓰기가 동시에 발생하기를 원하기 때문입니다.
cat
그런 다음 해당 표준 출력을 다중 스레드 버전(또는 유사한) 으로 파이프하고 싶습니다 . 의도는 실제 stdout이 느리도록 하는 것입니다(디스크의 파일임). 그러나 stdout에 쓰려고 할 때 도구가 멈추는 것을 원하지 않습니다. 만약 내가 원한다면
stdbuf -oL mytool
그런 다음 디스크가 사용 중이면 정지됩니다. 내가 할 때
stdbuf -oL mytool | cat
나는 실제로 무엇을 기대해야할지 완전히 확신하지 못합니다. 추가 버퍼링을 받을 수도 있습니다.커널 파이프 버퍼, stdout 버퍼링을 비활성화하면 사용되지 않을 것이라고 생각합니다 mytool
. 그런 다음 기본적으로 stdout 도 버퍼링되지만 실제로 stdout에 쓰는 cat
경우 중단될 수 있습니다. 무언가를 쓸 때 멈추지 만 동시에 읽지 않습니다.cat
mytool
cat
cat
이것이 바로 내가 쓰는 동안 동시에 읽는 다중 스레드를 찾고 있는 이유입니다 . 따라서 stdin에 쓰는 multi-threaded-cat
것은 절대 차단되지 않습니다(또는 단지 소프트 차단 또는 무엇이라고 부르든). 기본적으로 stdout에 쓰려고 multi-threaded-cat
하면 멈춥니다 multi-threaded-cat
. stdin에서 병렬로 읽기 때문에 문제가 되지 않습니다. 그래서 나는하고 싶습니다 :
stdbuf -oL mytool | multi-threaded-cat
multi-threaded-cat
나는 항상 들어오는 데이터를 가능한 한 빨리 소비하고 싶습니다 . 그렇기 때문에 멀티 스레드가 되어야 한다고 생각합니다. 그렇지 않고 write()를 사용하면 차단되거나 최소한 작은 문제가 발생할 수 있으며 동시에 stdin에서 read()를 수행할 수 없습니다.
multi-threaded-cat
또한 곧 데이터를 작성 하고 싶습니다 . 따라서 자체 버퍼를 먼저 채운 다음 쓰면 안 되며, 항상 즉시 쓰기를 원합니다.
내 사용 사례는 다음과 같습니다. 일부 하위 프로세스를 포함한 mytool은 표준 출력에 일부 로그 정보를 기록합니다. stdbuf
출력이 지연되지 않고 모든 하위 프로세스의 표준 출력이 동기화되는 것이 중요합니다. 모든 표준 출력은 파일 서버의 로그 파일로 리디렉션됩니다. 이는 약간 느리고 모든 쓰기가 완료될 때까지 기다리는 동안 성능이 크게 저하됩니다. 그래서 나는 multi-threaded-cat
그 사이에 뭔가를 원했습니다.
그런 도구가 있나요?
방금 이와 같은 나만의 도구를 구현했습니다.여기. 그것을 사용하면 사용하지 않는 것에 비해 속도가 800% 향상되었습니다. 하지만 내가 원하는 것을 수행할 수 있는 다른 도구나 다른 방법이 있을까요?
답변1
"멀티스레딩"은 구현 세부 사항이지 실제로 필요한 것은 아닙니다. 멀티스레딩 cat
구현은 여전히 차단될 수 있으며, 한 스레드는 읽고 있는 데이터를 넣을 위치를 기다리고 있기 때문에 다른 스레드를 기다리고 있습니다. 당신이 찾고있는 것은비차단 cat
, 잠재적으로 무제한의 버퍼가 있습니다.
이 sponge
유틸리티는 다음에서 제공됩니다.Joey Hess의 moreutils이것은 극단적인 버전입니다. 먼저 전체 파일을 메모리로 읽은 다음 출력을 씁니다. 이것은 당신에게 효과가 있을 수도 있고 그렇지 않을 수도 있습니다.
pv
버퍼 크기를 지정할 수 있습니다. 무한한 버퍼를 가질 수는 없지만 매우 큰 최대 크기(원하는 경우 메모리만큼 크게)를 설정할 수 있으며 버퍼는 필요한 경우에만 할당됩니다.
stdbuf -oL mytool | pv -q -B 1g >output-file