Следующий код не работает правильно в Windows (но работает в Linux):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(True)
sock.connect(address)
gobject.io_add_watch(
sock.fileno(),
gobject.IO_OUT | gobject.IO_ERR | gobject.IO_HUP,
callback)
Фрагменты комментариев в разных местах источника glib, а также в других местах упоминается, что в Windows сокеты переводятся в неблокирующий режим во время опроса. В результате постоянно вызывается обратный вызов self.outgoing_cb
, и запись в сокет завершается с таким сообщением об ошибке:
[Errno 10035] A non-blocking socket operation could not be completed immediately
Вызов sock.setblocking(True)
до написания, кажется, не обойти это. Снижая приоритет опроса и игнорируя сообщение об ошибке, оно работает, как и ожидалось, но отбрасывает многие события и потребляет много ресурсов ЦП. Есть ли способ обойти это ограничение в Windows?
Обновление
Я мог бы отметить, что весь смысл опроса POLLOUT
заключается в том, что когда вы делаете вызов write, вы не получите EAGAIN
/ EWOULDBLOCK
. Я думаю, что странное сообщение об ошибке, которое я получаю, будет Windows-эквивалентом этих двух кодов ошибок. Другими словами, я получаю gobject.IO_OUT
событий, когда сокет не позволяет мне успешно писать, и перевод его в режим блокировки все еще дает мне эту неуместную ошибку.
Еще одно обновление
В Linux, где это работает правильно, сокет не переключен в неблокирующий режим, и я получаю IO_OUT
, когда сокет позволит мне писать без блокировки или выдачи ошибки. Именно эту функцию я хочу лучше всего эмулировать / восстановить под Windows.
Дополнительные примечания
С man poll
:
poll() performs a similar task to select(2): it waits for one of a set
of file descriptors to become ready to perform I/O.
POLLOUT
Writing now will not block.
С man select
:
A file descriptor is considered ready if it is possible to perform the corre‐
sponding I/O operation (e.g., read(2)) without blocking.