2011-03-08 2 views
4
  1. Python에서 select.select과 함께 사용할 때 소켓을 비 블로킹으로 설정해야합니까?
  2. 그렇지 않은 경우 어떤 차이가 있습니까?

간혹 sendable을 반환하는 소켓에서 send을 호출하면 차단 될 수 있습니다. 게다가 나는 blocking 소켓이 일반적으로 주어진 전체 버퍼 (128 KiB)를 보낼 것을 알았다. 비 차단 모드에서 전송은 훨씬 적은 바이트 (앞에서 설명한 예와 비교하여 20-40 KiB)를 받아 들여 더 빨리 반환합니다. 나는 Python 3.1 on Lucid을 사용하고 있습니다.소켓이 파이썬에서 select와 함께 작동하도록 non-blocking이되어야합니까?

+0

"읽을 수있는 소켓에서'recv'를 호출하는 것을 의미하지 않습니까? – Mat

+0

@Mat : 예. 있습니다. –

답변

5

대답은 불행하게도 OS에 따라 다를 수 있습니다. 나는 리눅스에 대해서만 대답하고있다.

나는 선택의 차단/비 블로킹 소켓에 대한 차이를 인식 아니지만, Linux의 경우, select 시스템 호출 맨 페이지가 '버그'섹션이있다 : 리눅스에서

선택()는 소켓 파일 디스크립터를 " 읽을 준비가되었습니다"라고보고 할 수 있지만 그럼에도 불구하고 후속 읽기 블록은 입니다. 예를 들어 데이터가 도착했지만 검사시 체크섬이 잘못되어 삭제되는 경우이 경우 이 발생할 수 있습니다. 파일 설명자가 허위로 으로보고되는 다른 상황이있을 수 있습니다. 따라서 O_NONBLOCK을 블록으로 사용해서는 안되는 소켓에 사용하는 것이 더 안전 할 수 있습니다.

부작용없이이 문제를 "숨길"수있는 위의 파이썬 추상화를 의심합니다.

차단 쓰기는 더 많은 데이터를 보내는 것으로 예상됩니다. send은 소켓이 블로킹 된 경우 전체 요청을 전달하기에 충분한 버퍼 공간이있을 때까지 차단합니다. 소켓이 비 블로킹이면 소켓의 송신 버퍼에 현재 들어갈 수있는만큼만 송신합니다.

+1

환상적인 답변입니다. 정확히 내가 무엇을 찾고 있었는지. –

관련 문제