2010-07-21 3 views
2

스레드 A와 스레드 B가 2 개 있습니다.파이썬에서 파이프 파일 기술자를 사용할 때 EOF를 확인하는 방법은 무엇입니까?

스레드 A는 sys.stdin 또는 파이프의 읽기 끝 (os.pipe() 사용)에서 데이터를 가져옵니다. sys.stdin 또는 파이프의 읽기 끝에서 읽은 데이터가 모두 TCP 소켓에서 전송됩니다. 스레드 A는 select.select()를 사용하여 sys.stdin 또는 파이프의 읽기 끝에서 읽어야하는지 여부를 결정하고 select.select()는 1 초의 시간 초과를 사용하여 주기적으로 소켓 연결이 있는지 확인합니다 여전히 거기에.

스레드 B는 파이프의 쓰기 끝을 보유하고 일반적으로 실제 길이가 1 인 문자열을 파이프에 쓰고 쓰기 끝을 닫습니다.

스레드 A가 파이프에서 EOF를 확인하는 방법은 무엇입니까? 기본적으로 스레드 A가 더 이상 사용되지 않을 때 파이프를 닫으려고합니다. 그러나 sys.stdin에서 사용할 수있는 데이터가 불필요하게 차단되므로 pipe에서 read()를 차단할 위험이 없습니다.

도움을 주시면 감사하겠습니다. 고맙습니다!

답변

7

파이프에서 EOF를 확인하는 유일한 방법은 파이프에서 읽는 것입니다. 실제로, 파이프의 쓰기 끝을 닫을 때 실제 데이터를 읽을 수 없더라도 select.select()은 소켓이 읽을 준비가되었다고 말할 것입니다. 읽기 - 끝에서 읽을 때 빈 문자열 ('')은 EOF를 나타냅니다. 파이프가 차단 모드 인 경우에도 읽기를 차단하지 않습니다.

그렇다면 차단 읽기를 전혀 사용하지 않는 것이 좋습니다. fcntl.fcntl()을 사용하여 파이프를 차단하지 않도록 설정할 수 있습니다. 그리고 쓸모없는 겉보기 쓸데없는 게이트웨이 쓰레드를 무시하면서 쓰레드 B에서 소켓으로 직접 보내 2 개의 쓰레드를 사용하는 것을 피할 수 있습니다. 관리해야 할 소켓이 여러 개인 경우 또는 생산자 스레드가 여러 개인 경우 Twisted은 소켓 및 기타 통신을 관리하는 좋은 방법입니다.

+0

감사합니다. 매우 유용했습니다. 스레드 B는 내가 언급 한 것 이상을 수행하며 제거 할 수 없습니다. 방금 프로그램을 단순화하여 누군가 내 질문에 대답하기에 충분한 정보 만 제공하려고했습니다. 다시 한 번 감사드립니다! – pcd6623

관련 문제