Получение BlockingIOError (WinError 10035) при принятии сокета

#python #sockets #tornado #nio

#python #сокеты #торнадо #nio

Вопрос:

У меня появился шанс снова поработать с Python, но на этот раз я решил использовать Python 3.5 в своем путешествии.

Мне пришлось перенести рабочий неблокирующий сервер сокетов с помощью Tornado с Python 2.7 на 3.5. Использовался тот же исходный код, но на этот раз он работает не так, как нужно.

Я продолжаю получать [WinError 10035] A non-blocking socket operation could not be completed immediately on send всякий раз, когда принимаю соединение с сокетом, используя socket.accept() , и я все еще не могу понять, почему.

Попытался использовать пример кода, который я нашел несколько лет назад на GitHub Gist, и все еще продолжаю получать ошибку. Есть ли какие-либо изменения в библиотеке сокетов или это просто ошибка?

Ответ №1:

Эта ошибка безвредна и ожидаема. Проблема в том, что gist, на который вы ссылаетесь, не знает о специфичных для Windows кодах ошибок (в строке 24 он проверяет наличие EWOULDBLOCK и EAGAIN, но он также должен использовать WSAEWOULDBLOCK).

С тех пор, как была написана эта суть, Tornado получил несколько новых утилит, чтобы упростить это. Если вы используете IOStreams , вы можете использовать tornado.tcpserver.TCPServer для принятия ваших подключений, или если вы хотите продолжать использовать простые сокеты, вы можете использовать более низкий уровень tornado.netutil.add_accept_handler .