Функция select гарантирует, что вызовы методов сокетов, таких как accept и recv, не будут блокировать (приостанавливать) вызывающую программу, но в языке Python есть также возможность сделать сокеты неблокирующими в целом. С помощью метода setblocking объектов сокетов они устанавливаются в блокирующий или неблокирующий режим. Например, после вызова sock.setblocking(flag) сокет sock устанавливается в неблокирующий режим, если флаг flag равен нулю, и в блокирующий режим — в противном случае. Все сокеты изначально открываются в блокирующем режиме, поэтому вызовы методов сокетов всегда могут привести к приостановке вызывающей программы.
Но при работе в неблокирующем режиме, когда метод recv не находит данных или метод send не может немедленно передать данные, возбуждается исключение socket.error. Сценарий может перехватить это исключение, чтобы определить, готов ли сокет к обработке. В блокирующем режиме эти методы всегда блокируют вызывающую программу, пока не смогут продолжить работу. Конечно, обработка запроса клиента может не ограничиваться пересылкой данных (обработка запроса может потребовать длительных расчетов), поэтому неблокирующие сокеты не гарантируют отсутствие задержки на сервере в целом. Они лишь предоставляют еще один способ реализации серверов с мультиплексированием. Подобно select они лучше подходят для случаев, когда запросы клиентов могут быть обслужены быстро.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011