Автор оригинала: Doug Hellmann.
По умолчанию сокет
настроен так, что отправка или получение данных блокирует , останавливая выполнение программы, пока сокет не будет готов. Вызовы send ()
ожидают, пока буферное пространство станет доступным для исходящих данных, а вызовы recv ()
ожидают, пока другая программа отправит данные, которые можно прочитать. Эту форму операций ввода-вывода легко понять, но она может привести к неэффективной работе и даже к тупикам, если обе программы в конечном итоге будут ждать, пока другая отправит или получит данные.
Есть несколько способов обойти эту ситуацию. Один из них – использовать отдельный поток для связи с каждым сокетом. Однако это может вызвать другие сложности со связью между потоками. Другой вариант – изменить сокет, чтобы он не блокировался вообще, и немедленно вернуть его, если он не готов обработать операцию. Используйте метод setblocking ()
, чтобы изменить флаг блокировки для сокета. Значение по умолчанию – 1
, что означает блокировку. Передача значения 0
отключает блокировку. Если для сокета отключена блокировка и он не готов к операции, возникает ошибка socket.error
.
Компромиссное решение – установить значение тайм-аута для операций сокета. Используйте settimeout ()
, чтобы изменить тайм-аут сокета
на значение с плавающей запятой, представляющее количество секунд для блокировки перед тем, как решить, что сокет не готов к операции. По истечении времени ожидания возникает исключение timeout
.