2010-01-19 4 views
3

비 차단 모드로 열린 Linux FIFO가 있습니다. 예상대로 파일 개체에 대한 읽기를 호출하면 즉시 반환됩니다. select를 사용하여 대기중인 대기 시간이 없는지 확인하지만 사용 가능한 데이터가있을 때 내 프로그램에 계속 알림이 전송됩니다. 호기심에서 나는 readline 함수를 시도해 보았고, 개행 문자가 발견 될 때까지 readline 블록을 발견하는 것에 놀랐다. 내가 가기를 통해 프로세서 사용량을 검사하고 그것은 readline처럼 바쁜 대기하지 않는 것 같습니다. 내 응용 프로그램은 성능에 민감하기 때문에 nonblocking 소켓에서 readline을 사용할 때 성능에 영향이 있는지 궁금합니다.비 차단으로 열린 파이프의 Python readline

+1

개행까지 입력을 버퍼링하지 않으면'readline'이 어떻게 작동 할 것으로 기대하십니까? – pavpanchekha

+0

예외가 발생하거나 C 레벨 오류 번호가 발생하지 않으면 현재 동작이 적절합니다. 파이썬이 개행 문자를 찾을 때까지 비 블로킹 소켓에서 getc를 폴링하지 않는다는 사실에 더 놀랐습니다. – BrainCore

답변

1

파이썬의 readline의 핵심 부분은 fileobject.c에 있습니다 get_line 및

#ifdef HAVE_GETC_UNLOCKED 
#define GETC(f) getc_unlocked(f) 
#define FLOCKFILE(f) flockfile(f) 
#define FUNLOCKFILE(f) funlockfile(f) 
#else 
#define GETC(f) getc(f) 
#define FLOCKFILE(f) 
#define FUNLOCKFILE(f) 
#endif 

이 진행 특별한 아무것도 없습니다

FILE_BEGIN_ALLOW_THREADS(f) 
FLOCKFILE(fp); 

while ((c = GETC(fp)) != EOF && 
     (*buf++ = c) != '\n' && 
     buf != end) 
     ; 
FUNLOCKFILE(fp); 
FILE_END_ALLOW_THREADS(f) 

입니다. 당신의 관찰이 당신이 생각하는 것이라고 확신합니까?

+0

나를 위해이 코드 스 니펫을 찾아 주셔서 감사합니다. 당신이 게시 한 코드와 관련하여, 내 질문은 fp가 비 블로킹 인 경우 데이터가없는 즉시 GETC (fp)가 반환되는지 여부입니다. 즉, while 루프가 빠르게 반복되고 CPU주기가 낭비되는 것을 의미합니다. – BrainCore

+0

이 경우 C가 무엇을하는지 모르겠습니다. 최상의 것은 당신이 재현성있는 것을 게시 할 수 있고 당신의 관찰을 다시 확인할 수있는 것입니다. 나는 그것이 바쁜 기다릴 것이라고 생각 하겠지만, 당신은 그것이 아니라고보고했다. –