2011-09-13 3 views
0

비 차단 소켓에서 데이터를 수신하기 위해 최적의 절전 값을 찾고 있습니다. 예 :non-blocking 호출로 잠들었습니다.

while True: 
    data=s.recv(1024) 
    if not data: 
     time.sleep(10) #10ms 
    else: 
     pass #... 

아무런 수면으로도 CPU 사용률이 100 %가되지 않으므로 최고의 CPU 사용률과 대역폭을 얻는 방법에 대해 생각해보십시오. CPU가 스레드 전환을 수행 할 수있는 시간이 얼마나 오래 있습니까?

Btw, SO_SNDBUF/SO_RECVBUF를 통해 소켓의 버퍼를 설정하고 TCP_NODELAY를 설정하는 것이 합당한가, 아니면 결합하지 말아야 하는가?

+0

패턴을 취소합니다. 지금! 'sleep()'함수가 존재했음을 잊어 버려라. 'sleep()'을 사용할 때마다 또 다른 적절한 방법이 있습니다. –

답변

2

자신이 그렇게해서는 안됩니다. select 호출을 사용하십시오. 데이터가 수신되지 않아도 코드를 자주 깨워야하는 경우 시간 초과가 필요합니다.

현재 TCP_NODELAY은 (는) 송신 측에서 사용자의 read에 영향을 미치지 않습니다.

+0

제 경우에는 소켓이 읽기/쓰기 호출을 전환합니다. recv/보내기/보내기/보내기/recv/recv/... –

1

select을 사용하십시오. 그것은 기본적으로 프로그램을 멈추고 소켓에서 사용할 수있는 데이터가있을 때 깨어납니다.

+0

select (...)를 사용하면 데이터가 반환 될 때 비 블로킹 소켓에서 데이터가 전달 될 수 있다고 생각했습니다. –

+1

@ 미스터 아니. 그 생각은 어디서 났니? 프로그래밍 오류가 발생하지 않으면 TCP/IP에 대한 모든 API를 통해 데이터를 잃을 수 없습니다. – EJP

3

sleep()을 사용하려는 경우 블로킹 소켓을 사용하지 않으시겠습니까?

관련 문제