Ниже с помощью socket.settimeout
SetTimeout (...) методом socket._socketobject экземпляра SetTimeout (тайм-аут)
Установите тайм-аут на операции сокета. «тайм-аут» может быть плавающим, в секундах или None. Установка таймаута None отключает функцию таймаута и эквивалентна setblocking(1)
. Установка времени ожидания равна setblocking(0)
.
Так что я не знаю, почему так setblocking(0)
и settimeout(0)
как это сделано выше. Это означает, что read
сразу же вернется с EAGAIN
или EWOULDBLOCK
, если данных нет. Когда другой конец закроет соединение, read
вернется со значением 0
.
Чтение тайм-аута будет иметь смысл только в состоянии «блокировки», когда по истечении времени, равного таймауту, и нет данных для чтения, чтение должно возвращать или EWOULDBLOCK
.
В общем, это не повлияет на write
таймаут. Когда вы устанавливаете сокет на неблокирующийся, и если «буферы записи» заполнены (что редко случается, если нет достаточно «медленного» приемника), и если write
, вероятно, будет блокироваться, он должен немедленно вернуться сили EWOULDBLOCK
, а затем бремя ответственности за приложение, чтобы убедиться, что write
выдается снова.
Вы имеете в виду 'EAGAIN' или' EWOULDBLOCK' вместо 'EINTR' (последний может быть поднят, если сигнал получен во время системного вызова (блокировки?) В текущей версии Python. В Python 3.5+ вы не должны видеть 'EINTR': [PEP 0475 - сбои системных вызовов повторно с EINTR] (https://www.python.org/dev/peps/pep-0475/) – jfs
Прошу прощения - да, это' EAGAIN' или 'EWOULDBLOCK ' – gabhijit
Отредактировано. исправить ошибки – gabhijit