selectors
Этот модуль позволяет осуществлять высокоуровневую и эффективную многопоточную обработку ввода-вывода.
Поддерживаемые ОС-примитивы: epoll, kqueue, poll и Windows select.
Для использования потокобезопасной версии этого модуля, он должен быть скомпилирован с опциями -d:threadsafe и --threads:on.
Поддерживаемые функции: файлы, сокеты, каналы, таймеры, процессы, сигналы и пользовательские события.
Полностью поддерживаемые ОС: MacOSX, FreeBSD, OpenBSD, NetBSD, Linux (кроме Android).
Частично поддерживаемые ОС: Windows (только сокеты и пользовательские события), Solaris (файлы, сокеты, дескрипторы и пользовательские события). Android (файлы, сокеты, дескрипторы и пользовательские события).
TODO: /dev/poll, event ports и события файловой системы.
Импорты
- os, nativesockets
Типы
Selector[T] = ref object
- Объект, содержащий дескрипторы для проверки состояния чтения/записи Исходный код Редактировать
IOSelectorsException = object of CatchableError
- Исключение, которое генерируется, если происходит ошибка IOSelectors. Исходный код Редактировать
Event {...}{.pure.} = enum Read, ## Descriptor is available for read Write, ## Descriptor is available for write Timer, ## Timer descriptor is completed Signal, ## Signal is raised Process, ## Process is finished Vnode, ## BSD specific file change User, ## User event is raised Error, ## Error occurred while waiting for descriptor VnodeWrite, ## NOTE_WRITE (BSD specific, write to file occurred) VnodeDelete, ## NOTE_DELETE (BSD specific, unlink of file occurred) VnodeExtend, ## NOTE_EXTEND (BSD specific, file extended) VnodeAttrib, ## NOTE_ATTRIB (BSD specific, file attributes changed) VnodeLink, ## NOTE_LINK (BSD specific, file link count changed) VnodeRename, ## NOTE_RENAME (BSD specific, file renamed) VnodeRevoke ## NOTE_REVOKE (BSD specific, file revoke occurred)- Перечисление, содержащее типы событий Исходный код Редактировать
ReadyKey = object fd*: int ## file/socket descriptor events*: set[Event] ## set of events errorCode*: OSErrorCode ## additional error code information for ## Error events- Объект, содержащий результат для дескриптора Исходный код Редактировать
SelectEvent = object
- Объект, содержащий пользовательское событие Исходный код Редактировать
Константы
ioselSupportedPlatform = true
- Эта константа используется для определения, полностью ли поддерживается целевая платформа модулем
ioselectors. Исходный код Редактировать
Процедуры
proc newSelector[T](): Selector[T]
- Создает новый селектор Исходный код Редактировать
proc close[T](s: Selector[T])
- Закрывает селектор. Исходный код Редактировать
proc registerHandle[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event]; data: T)- Регистрирует дескриптор файла/сокета
fdв селектореsс событиями, заданными вevents. Данныеdataопределяются приложением и передаются при срабатывании события. Исходный код Редактировать proc updateHandle[T](s: Selector[T]; fd: int | SocketHandle; events: set[Event])
- Обновляет дескриптор файла/сокета
fd, зарегистрированный в селектореs, с новыми событиями, заданными вevent. Исходный код Редактировать proc registerTimer[T](s: Selector[T]; timeout: int; oneshot: bool; data: T): int {...}{. discardable.}-
Регистрирует уведомление о таймере через
timeout(в миллисекундах) в селектореs.Если
oneshotравноtrue, таймер будет уведомлять только один раз.Установите
oneshotвfalse, если требуется периодическое уведомление.Данные
dataопределяются приложением и передаются при срабатывании таймера.Возвращает дескриптор файла для зарегистрированного таймера.
Исходный код Редактировать proc registerSignal[T](s: Selector[T]; signal: int; data: T): int {...}{.discardable.}-
Регистрирует уведомление о сигнале Unix с
signalв селектореs.Данные
dataопределяются приложением и передаются при возникновении сигнала.Возвращает дескриптор файла для зарегистрированного сигнала.
Примечание: Эта функция не поддерживается на
Исходный код РедактироватьWindows. proc registerProcess[T](s: Selector[T]; pid: int; data: T): int {...}{.discardable.}-
Регистрирует уведомление о процессе (pid) (когда процесс завершился) в селекторе
s.Данные
dataопределяются приложением и передаются при завершении процесса сpid.Возвращает дескриптор файла для зарегистрированного сигнала.
Исходный код Редактировать proc registerEvent[T](s: Selector[T]; ev: SelectEvent; data: T)
-
Регистрирует событие селектора
evв селектореs.Данные
Исходный код Редактироватьdataопределяются приложением и передаются при наступленииev. proc registerVnode[T](s: Selector[T]; fd: cint; events: set[Event]; data: T)
-
Регистрирует события vnode (специфичные для BSD/MacOSX) для дескриптора файла
fdи событийevents.dataданные, определяемые приложением, которые будут переданы при возникновении события vnode.Примечание: Эта функция поддерживается только BSD и MacOSX.
Исходный код Редактировать proc newSelectEvent(): SelectEvent {...}{.raises: [], tags: [].}- Создает новое пользовательское событие. Исходный код Редактировать
proc trigger(ev: SelectEvent) {...}{.raises: [], tags: [].}- Срабатывает событие
ev. Исходный код Редактировать proc close(ev: SelectEvent) {...}{.raises: [], tags: [].}- Закрывает пользовательское событие
ev. Исходный код Редактировать proc unregister[T](s: Selector[T]; ev: SelectEvent)
- Удаляет пользовательское событие
evиз селектораs. Исходный код Редактировать proc unregister[T](s: Selector[T]; fd: int | SocketHandle | cint)
- Удаляет дескриптор файла/сокета
fdиз селектораs. Исходный код Редактировать proc selectInto[T](s: Selector[T]; timeout: int; results: var openArray[ReadyKey]): int-
Ожидает событий, зарегистрированных в селекторе
s.Аргумент
timeoutзадаёт максимальное время ожидания в миллисекундах, если нет готовых событий. Значение таймаута-1заставит функцию ожидать неопределённое время. Все доступные события будут сохранены в массивеresults.Возвращает количество сработавших событий.
Исходный код Редактировать proc select[T](s: Selector[T]; timeout: int): seq[ReadyKey]
-
Ожидает событий, зарегистрированных в селекторе
s.Аргумент
timeoutзадаёт максимальное время ожидания в миллисекундах, если нет готовых событий. Значение таймаута-1заставит функцию ожидать неопределённое время.Возвращает список сработавших событий.
Исходный код Редактировать proc getData[T](s: Selector[T]; fd: SocketHandle | int): var T
- Получает пользовательские данные
data, связанные с дескрипторомfd. Если указанный дескрипторfdне зарегистрирован, возвращается пустое/стандартное значение. Исходный код Редактировать proc setData[T](s: Selector[T]; fd: SocketHandle | int; data: var T): bool
-
Связывает пользовательские данные
dataс дескрипторомfd.Возвращает
Исходный код Редактироватьtrue, если данные были успешно обновлены,falseв противном случае. proc contains[T](s: Selector[T]; fd: SocketHandle | int): bool {...}{.inline.}- Определяет, содержит ли селектор дескриптор файла. Исходный код Редактировать
proc getFd[T](s: Selector[T]): int
-
Получает базовый дескриптор файла селектора.
Для селекторов poll и select возвращается
Исходный код Редактировать-1.
Шаблоны
template isEmpty[T](s: Selector[T]): bool
- Возвращает
true, если в селекторе нет зарегистрированных событий или дескрипторов. Исходный код Редактировать template withData[T; ](s: Selector[T]; fd: SocketHandle | int; value, body: untyped)- Извлекает данные приложения, назначенные с дескриптором
fdдляvalue. Эти данныеvalueможно изменить в рамках вызоваwithData.s.withData(fd, value) do: # block is executed only if ``fd`` registered in selector ``s`` value.uid = 1000
Исходный код Редактировать template withData[T; ](s: Selector[T]; fd: SocketHandle | int; value, body1, body2: untyped)- Извлекает данные приложения, назначенные с дескриптором
fdдляvalue. Эти данныеvalueможно изменить в рамках вызоваwithData.s.withData(fd, value) do: # block is executed only if ``fd`` registered in selector ``s``. value.uid = 1000 do: # block is executed if ``fd`` not registered in selector ``s``. raise
Исходный код Редактировать
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/selectors.html