Connect with us

Обучение

Заметки Python #22: Модуль select. Один сервер — много клиентов

Вот мы добрались и до обработки нескольких клиентов на одном сервере. с помощью модуля select. Сегодня наши клиенты будут общаться в общем чате, как в настоящем Телеграме.

Потоки ввода/вывода

Чтобы постичь основы highload в Python используют три базовых подхода:

  1. Отдельный поток на каждого клиента. Почти совсем не хайлоад, т.к. этот вариант потребляет достаточно много системных ресурсов, поэтому, при увеличении нагрузки на сервер, его использование будет опасным решением
  2. Неблокирующие сокеты. В Питоне с третей версии для реализации таких советов предусмотрен метод setblocking(), в который передается параметр, равный 0.
  3. Применение системных вызовов select() и poll() из модуля select — самое интересное. Системный вызов select() поддерживается всеми программными платформами, подразумевающими сетевое взаимодействие

Модуль select

Системный вызов select() можно использовать для опроса — или мультиплексирования — обработки нескольких потоков ввода-вывода, не используя потоки управления или дочерние процессы. В системах UNIX эти вызовы можно применять для работы с сокетами, каналами и многими другими типами файлов. В Windows — только для работы с сокетами.

select(r, w, e [, timeout])

В первых трех аргументах передаются списки с целочисленными дескрипторами файлов или с объектами, обладающими методом fileno(), который возвращает дескриптор файла

r — список объектов, которые передают информацию серверу (эти клиенты передают информацию на сервер)

w — список объектов, которые считывают информацию от сервера, но ничего ему не передают и не запрашивают у него (эти клиенты только принимают данные, то, что передает им сервер)

e — исключения

timeout — Таймаут необходим, чтобы проверять сокет на наличие подключений новых клиентов, на наличие данных

Системный вызов select() возвращает кортеж списков с объектами, находящимися в требуемом состоянии

Как это работает?

Массив дескрипторов клиентских сокетов можно передавать в качестве аргумента функции select, а она в свою очередь предоставляет список сокетов, которые:

  • Готовы принять новые данные;
  • Имеют новые данные для чтения;
  • Содержат ошибки выполнения.

Конструкция select — это даже не функция, а системный вызов. Она заложена не в сам Python, а в операционную систему. Таким образом, традиционный подход с простым перебором заменяется на более эффективный, с особым оптимизированным алгоритмом.

Пример использования

Яркой демонстрацией модуля select является отправка/прием сообщений между сервером и несколькими клиентами. Для этого мы сначала создадим служебный файл, запускающий несколько «клиентов» с использованием модуля subprocess. Пусть это будет service.py

Далее мы напишем серверную часть — server.py

Касаемо функций — clients_read() обходит список советов на чтение и формируется словарь запросов в формате, а clients_write() обходит сокеты на запись. Запросы обрабатываются на основе присланных клиентских данных,  обрабатываются и отсылаются сервером на основании словаря запросов requests. Основная функция сервера — mainserver(). Она открывает сокет на прослушивание с соответствующим таймаутом для операций ввода/вывода. Проверка подключений осуществляется функцией accept() и добавляет новое подключение в список clients, изначально пустой. Далее функцией select мы читаем данные из клиентских сокетов и записываем данные в них (для подключений которые попали в список clients). Сама функция select() возвращает кортеж из трех списков: файловые дескрипторы на чтение, на запись и имеющие исключение. На очереди — клиентская часть (client.py)

В результате, при запуске служебного файла service.py получим 10 разных клиентов в 10 окнах консоли,  обрабатываемыми одним сервером с помощью модуля select

Click to comment

Leave a Reply

Ваш e-mail не будет опубликован.

Лучшие сервисы стриминга музыки в 2019 году

Сервисы

Wink Ростелеком: Samsung LG, Sony, Phillips, Android TV

Ростелеком

LG WEB OS: приложения, обновления, настройка, проблемы со звуком

Гаджеты

Ноутбуки Asus не видят жесткий диск. Автоматический вход в BIOS при старте

Гаджеты

.

Digital2.ru - тренды, IT, разработка, цифровая экономика

Connect
Подпишись на нас