Рубрики
Без рубрики

Неблокирующая связь и таймауты

Автор оригинала: Doug Hellmann.

По умолчанию сокет настроен так, что отправка или получение данных блокирует , останавливая выполнение программы, пока сокет не будет готов. Вызовы send () ожидают, пока буферное пространство станет доступным для исходящих данных, а вызовы recv () ожидают, пока другая программа отправит данные, которые можно прочитать. Эту форму операций ввода-вывода легко понять, но она может привести к неэффективной работе и даже к тупикам, если обе программы в конечном итоге будут ждать, пока другая отправит или получит данные.

Есть несколько способов обойти эту ситуацию. Один из них – использовать отдельный поток для связи с каждым сокетом. Однако это может вызвать другие сложности со связью между потоками. Другой вариант – изменить сокет, чтобы он не блокировался вообще, и немедленно вернуть его, если он не готов обработать операцию. Используйте метод setblocking () , чтобы изменить флаг блокировки для сокета. Значение по умолчанию – 1 , что означает блокировку. Передача значения 0 отключает блокировку. Если для сокета отключена блокировка и он не готов к операции, возникает ошибка socket.error .

Компромиссное решение – установить значение тайм-аута для операций сокета. Используйте settimeout () , чтобы изменить тайм-аут сокета на значение с плавающей запятой, представляющее количество секунд для блокировки перед тем, как решить, что сокет не готов к операции. По истечении времени ожидания возникает исключение timeout .