2011-05-16 7 views
3

두 개의 스레드를 실행했지만 모두 동일한 표준 출력으로 인쇄해야하는 경우 서로 기다려야합니까? 그래서 4 개의 쓰레드 모두에 쓸 내용이 있다면, 멈추고 stdout이 자유 롭기를 기다려서 작업에 착수 할 수 있어야한다고 말하십니까?파이썬 스레드가 표준 출력을 기다리고 있습니까?

+0

나는 stdout이 각각의 쓰레드가 쓰고 계속할 수있는 버퍼를 가질 것이라고 상상한다. 버퍼에 쓰는 스레드가 많으면 버퍼 오버 플로우가 발생할 수 있다고 생각한다. 확실하지. 다른 사람들이 게시하는 것을보고 싶습니다. – Richard

답변

3

OS의 시스템 호출에서 깊이가 깊고 (깊이가 깊은 ...) 내려갑니다. 최신 OS에는 스레드 세이프 터미널 인쇄 루틴이 있습니다.이 루틴은 일반적으로 실제 장치 액세스 (또는 쓰는 대상과 설정이 무엇인지에 따라 버퍼)를 수행하는 중요한 섹션을 잠급니다. 그러나 이러한 대기는 매우 짧습니다. 이것이 여기서 다루는 IO이므로, 대기 시간은 실제 IO 실행에 비해 상대적으로 무시할 수 있습니다.

0

다릅니다. stdout이 파이프 인 경우, 각 파이프는 파이프가 작성 될 때 대체 할 수있는 4KB 버퍼를 확보합니다. 버퍼가 가득 차거나 flush()을 호출하면 버퍼가 플러시됩니다.

stdout이 터미널 인 경우, 출력은 일반적으로 라인 버퍼링됩니다. 따라서 개행 문자를 인쇄 할 때까지 모든 쓰레드가 버퍼에 쓸 수 있습니다. 개행 문자가 작성되면 전체 버퍼가 콘솔에 덤프되고과 동시에 개행을 쓰는 다른 모든 스레드 이 대기해야합니다.

개개의 스레드가 개행을 쓰는 것보다 다른 것을하기 때문에, 각 스레드는 CPU를 얻습니다. 따라서 최악의 경우에도 혼잡은 아주 작아야합니다.

비록 한 가지 예외가 있습니다 : 많은 양의 데이터를 작성하거나 콘솔이 느린 경우 (직렬 포트를 사용하는 Linux 커널 디버그 콘솔과 같이). 콘솔이 데이터의 양에 대처할 수 없을 때 버퍼가 플러시 될 때까지 기다리는 새 라인 쓰기에 점점 많은 스레드가 멈추게됩니다.

관련 문제