Функция 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".