Функция Python socket.sendall()

Я читаю Учебник по сетевому программированию с Python, и в этом документе автор говорит, что "Функция sendall() должна использоваться только с блокирующими сокетами."

Но я не вижу такого условия в документации Python, socket.sendall(строка [, flags]).

Правильно ли автор PyNet?

Ответы

Ответ 1

Если есть сомнения, проверьте источник.

socket_sendall явно отказывается, как только send() возвращает -1, что он будет делать (с errno из EAGAIN или EWOULDBLOCK), если вы вызываете его в неблокирующем сокете без вызова poll() или select(). (И функция internal_select пропускает вызов poll()/select(), когда сокет не блокирует.)

Итак, я бы сказал, что автор PyNet верен.

Ответ 2

sendall() не имеет смысла для неблокирующего сокета. Он должен блокировать, если он не может сразу отправить все данные, иначе он не будет называться "sendall".