Выбор конструкции сервера

vybor konstrukcii servera Сетевые сценарии

Так в каких же случаях для создания сервера следует использовать вызов select вместо потоков выполнения или ветвления? Конечно, в каждом приложении могут быть свои потребности, но обычно считается, что серверы, основанные на вызове select, очень хорошо работают, когда обслуживание клиента занимает относительно короткие интервалы времени. Если обслуживание может занимать продолжительное время, потоки или ветвление могут оказаться более удачным способом распределения обработки нескольких клиентов. Потоки и ветвление особенно полезно применять, если помимо передачи данных клиентам требуется длительная их обработка. Однако возможны также комбинации этих приемов — ничто не мешает запускать потоки выполнения из цикла опроса на основе вызова select.

Важно помнить, что схемы, основанные на select (и неблокирующих сокетах), не вполне защищены от блокирования. В примере 12.9, представленном выше, вызов метода send, который возвращает текст клиенту, тоже может оказаться блокирующим и задержать работу всего сервера. Можно было бы преодолеть эту опасность блокирования, применяя select для проверки готовности к операции вывода перед попыткой выполнить ее (например, использовать список writesocks и добавить еще один цикл для отправки ответов готовым выходным сокетам), но это существенно уменьшило бы ясность программы.

Однако в целом, когда нельзя разделить обработку клиентского запроса на этапы, чтобы ее можно было мультиплексировать с другими запросами, и не заблокировать основной цикл сервера, select может оказаться не лучшим способом построения сервера. Эти ограничения учитываются далеко не всеми существующими сетевыми серверами.

Кроме того, реализация на основе вызова select оказывается также более сложной, чем реализация на основе ветвления процессов или потоков выполнения, поскольку требует вручную передавать управление всем участвующим задачам (сравните, например, версии этого сервера с потоками и с select, даже без применения select для выполнения операций записи). Как всегда, степень этой сложности зависит от конкретного приложения. Модуль asyncore из стандартной библиотеки, упоминавшийся выше, может упростить реализацию цикла событий сервера на основе вызова select, а фреймворк Twisted предлагает дополнительные, гибридные решения.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий