MicroPython:Библиотеки/uselect

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Модуль uselect – ожидание событий в нескольких потоковых объектах[1]

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

Функции

  • uselect.poll() – создает экземпляр класса Poll.
  • uselect.select(rlist, wlist, xlist[, timeout]) – ждет активности на нескольких объектах.

Это малоэффективная функция, которая была добавлена в некоторые MicroPython-порты для совместимости. Вместо нее рекомендуем использовать методы класса Poll.

Класс «Poll»

Методы

  • poll.register(obj[, eventmask]) – регистрирует потоковый объект obj для опроса. В аргументе eventmask задается тип события, которое нужно проверить. Значение в нем задается по принципу логического ИЛИ:
    • uselect.POLLIN – есть данные для считывания
    • uselect.POLLOUT – есть данные для записи

Учтите, что для аргумента eventmask некорректно использовать флаги uselect.POLLHUP и uselect.POLLERR (это необусловленные события, возвращаемые методом poll() независимо от того, были они запрошены или нет). Эта семантика – наследие POSIX. По умолчанию в eventmask стоит uselect.POLLIN | uselect.POLLOUT. Нормально вызывать эту функцию несколько раз на одном и том же obj. Успешные вызовы register() обновляют значение eventmask (т.е. работают как modify()).

  • poll.unregister(obj) – отменяет регистрацию obj для опроса.
  • poll.modify(obj, eventmask) – изменяет значение eventmask для obj. Если объект obj не зарегистрирован, OSError выдаст ошибку ENOENT.
  • poll.poll(timeout=-1, /) – ждет исключительной ситуации или момента, когда хотя бы один из зарегистрированных объектов не будет готов к выполнению операций. Опционально можно задать таймаут timeout в миллисекундах. Если аргумент timeout не будет задан или в нем будет значение «-1», то таймаута задано не будет.

Возвращает кортеж (obj, event, …). В нем могут быть не только obj и event, но и другие элементы (какие именно – зависит от платформы и версии), поэтому его размер не всегда будет равен двум. В элементе event хранится информация о том, какие события произошли с потоком – это комбинация констант uselect.POLL***, описанных выше. Учтите, что метод poll() может в любое время вернуть флаги select.POLLHUP и uselect.POLLERR (даже если его об этом не просили), и на это нужно отреагировать соответствующим образом (отменить регистрацию потока и, возможно, даже закрыть его), потому что иначе, возможно, все последующие вызовы poll() будут снова сразу же возвращать эти же флаги для этого же потока. В случае истечения времени в timeout будет возвращен пустой кортеж. Отличие от CPython: В возвращаемом кортеже может быть более двух элементов.

  • poll.ipoll(timeout=-1, flags=0, /) – работает аналогично poll.poll(), но возвращает не кортеж, а итератор, генерирующий «вызываемый кортеж». В этой функции реализован более эффективный способ опроса потоков, не требующий выделения памяти.

Если в аргументе flags будет задано «1», события начнут работать в одноразовом режиме: у потоков, события для которых уже случились, значение в eventmask будет автоматически сброшено, что эквивалентно poll.modify(obj, 0). В результате новые события для этого потока не будут обрабатываться до тех пор, пока значение в его eventmask не будет обновлено при помощи poll.modify(). Этот режим полезен при использовании планировщика для асинхронных операций ввода/вывода. Отличие от CPython: Эта функция является расширением MicroPython.

См.также

Внешние ссылки