# `select` — Waiting for I/O completion

This module provides access to the `select()` and `poll()` functions available in most operating systems, `devpoll()` available on Solaris and derivatives, `epoll()` available on Linux 2.5+ and `kqueue()` available on most BSD. Note that on Windows, it only works for sockets; on other operating systems, it also works for other file types (in particular, on Unix, it works on pipes). It cannot be used on regular files to determine whether a file has grown since it was last read.

Примітка

The `selectors` module allows high-level and efficient I/O multiplexing, built upon the `select` module primitives. Users are encouraged to use the `selectors` module instead, unless they want precise control over the OS-level primitives used.

Availability: not WASI.

This module does not work or is not available on WebAssembly. See WebAssembly platforms for more information.

Модуль визначає наступне:

exception select.error

  Застарілий псевдонім `OSError`.

  Змінено в версії 3.3: Після PEP 3151 цей клас отримав псевдонім `OSError`.

select.devpoll()

  Returns a `/dev/poll` polling object; see section /dev/poll polling objects below for the methods supported by devpoll objects.

  `devpoll()` objects are linked to the number of file descriptors allowed at the time of instantiation. If your program reduces this value, `devpoll()` will fail. If your program increases this value, `devpoll()` may return an incomplete list of active file descriptors.

  Новий файловий дескриптор не успадковується.

  Added in version 3.3.

  Змінено в версії 3.4: Новий файловий дескриптор тепер не успадковується.

  Availability: Solaris.

select.epoll(sizehint=-1, flags=0)

  Return an edge polling object, which can be used as Edge or Level Triggered interface for I/O events.

  sizehint informs epoll about the expected number of events to be registered. It must be positive, or `-1` to use the default. It is only used on older systems where epoll_create1(2) is not available; otherwise it has no effect (though its value is still checked).

  flags застаріло та повністю ігнорується. Однак, коли надається, його значення має бути `0` або `select.EPOLL_CLOEXEC`, інакше `OSError` викликається.

  Перегляньте розділ Edge and level trigger polling (epoll) objects нижче, щоб дізнатися про методи, які підтримуються об’єктами електронного опитування.

  Об’єкти `epoll` підтримують протокол керування контекстом: при використанні в операторі `with` новий дескриптор файлу автоматично закривається в кінці блоку.

  Новий файловий дескриптор не успадковується.

  Змінено в версії 3.3: Додано параметр flags.

  Змінено в версії 3.4: Додано підтримку оператора `with`. Новий файловий дескриптор тепер не успадковується.

  Застаріло починаючи з версії 3.4: Параметр flags. `select.EPOLL_CLOEXEC` зараз використовується за умовчанням. Використовуйте `os.set_inheritable()`, щоб зробити дескриптор файлу спадковим.

  Змінено в версії 3.15: When CPython is built, this function may be disabled using `--disable-epoll`.

  Availability: Linux >= 2.5.44.

select.poll()

  Returns a polling object, which supports registering and unregistering file descriptors, and then polling them for I/O events; see section Polling objects below for the methods supported by polling objects.

  Availability: Unix.

select.kqueue()

  Returns a kernel queue object; see section Kqueue objects below for the methods supported by kqueue objects.

  Новий файловий дескриптор не успадковується.

  Змінено в версії 3.4: Новий файловий дескриптор тепер не успадковується.

  Availability: BSD, macOS.

select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

  Returns a kernel event object; see section Kevent objects below for the methods supported by kevent objects.

  Availability: BSD, macOS.

select.select(rlist, wlist, xlist, timeout=None)

  This is a straightforward interface to the Unix `select()` system call. The first three arguments are iterables of „waitable objects“: either integers representing file descriptors or objects with a parameterless method named `fileno()` returning such an integer:

  - rlist: дочекатися готовності до читання

  - wlist: дочекатися готовності до запису

  - xlist: зачекайте на «виняткову умову» (перегляньте сторінку посібника щодо того, що ваша система вважає такою умовою)

  Empty iterables are allowed, but acceptance of three empty iterables is platform-dependent. (It is known to work on Unix but not on Windows.) The optional timeout argument specifies a time-out in seconds; it may be a non-integer to specify fractions of seconds. When the timeout argument is omitted or `None`, the function blocks until at least one file descriptor is ready. A time-out value of zero specifies a poll and never blocks.

  Повернене значення — це трійка списків готових об’єктів: підмножини перших трьох аргументів. Коли час очікування досягнуто, а дескриптор файлу не готовий, повертаються три порожні списки.

  Серед прийнятних типів об’єктів у ітераціях є файлові об’єкти Python (наприклад, `sys.stdin` або об’єкти, повернуті `open()` або `os.popen()`), сокет об’єкти, які повертає `socket.socket()`. Ви також можете визначити клас wrapper самостійно, за умови, що він має відповідний метод `fileno()` (який дійсно повертає дескриптор файлу, а не просто випадкове ціле число).

  Примітка

  File objects on Windows are not acceptable, but sockets are. On Windows, the underlying `select()` function is provided by the WinSock library, and does not handle file descriptors that don’t originate from WinSock.

  Змінено в версії 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати `InterruptedError`.

  Змінено в версії 3.15: Accepts any real number as timeout, not only integer or float.

select.PIPE_BUF

  The minimum number of bytes which can be written without blocking to a pipe when the pipe has been reported as ready for writing by `select()`, `poll()` or another interface in this module. This doesn’t apply to other kinds of file-like objects such as sockets.

  POSIX гарантує, що це значення буде не менше 512.

  Availability: Unix

  Added in version 3.2.

## `/dev/poll` polling objects

Solaris and derivatives have `/dev/poll`. While `select()` is O(highest file descriptor) and `poll()` is O(number of file descriptors), `/dev/poll` is O(active file descriptors).

`/dev/poll` behaviour is very close to the standard `poll()` object.

devpoll.close()

  Закрийте файловий дескриптор об’єкта опитування.

  Added in version 3.4.

devpoll.closed

  `True`, якщо об’єкт опитування закрито.

  Added in version 3.4.

devpoll.fileno()

  Повертає номер дескриптора файлу об’єкта опитування.

  Added in version 3.4.

devpoll.register(fd[, eventmask])

  Зареєструйте дескриптор файлу з об’єктом опитування. Подальші виклики методу `poll()` перевірятимуть, чи є в дескрипторі файлу будь-які незавершені події введення/виведення. fd може бути або цілим числом, або об’єктом із методом `fileno()`, який повертає ціле число. Файлові об’єкти реалізують `fileno()`, тому їх також можна використовувати як аргумент.

  eventmask is an optional bitmask describing the type of events you want to check for. The constants are the same as with `poll()` object. The default value is a combination of the constants `POLLIN`, `POLLPRI`, and `POLLOUT`.

  Попередження

  Registering a file descriptor that’s already registered is not an error, but the result is undefined. The appropriate action is to unregister or modify it first. This is an important difference compared with `poll()`.

devpoll.modify(fd[, eventmask])

  This method does an `unregister()` followed by a `register()`. It is (a bit) more efficient than doing the same explicitly.

devpoll.unregister(fd)

  Видаліть дескриптор файлу, який відстежується об’єктом опитування. Як і метод `register()`, fd може бути цілим числом або об’єктом із методом `fileno()`, який повертає ціле число.

  Спроба видалити дескриптор файлу, який ніколи не був зареєстрований, безпечно ігнорується.

devpoll.poll([timeout])

  Polls the set of registered file descriptors, and returns a possibly empty list containing `(fd, event)` 2-tuples for the descriptors that have events or errors to report. fd is the file descriptor, and event is a bitmask with bits set for the reported events for that descriptor — `POLLIN` for waiting input, `POLLOUT` to indicate that the descriptor can be written to, and so forth. An empty list indicates that the call timed out and no file descriptors had any events to report. If timeout is given, it specifies the length of time in milliseconds which the system will wait for events before returning. If timeout is omitted, -1, or `None`, the call will block until there is an event for this poll object.

  Змінено в версії 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати `InterruptedError`.

  Змінено в версії 3.15: Accepts any real number as timeout, not only integer or float.

## Edge and level trigger polling (epoll) objects

> https://linux.die.net/man/4/epoll

> The eventmask is a bit mask using the following constants:

> Постійний | Значення
> --- | ---
> `EPOLLIN` | Available for read.
> `EPOLLOUT` | Available for write.
> `EPOLLPRI` | Urgent data for read.
> `EPOLLERR` | Error condition happened on the associated fd.
> `EPOLLHUP` | Hang up happened on the associated fd.
> `EPOLLET` | Set Edge Trigger behavior, the default is Level Trigger behavior.
> `EPOLLONESHOT` | Set one-shot behavior. After one event is pulled out, the fd is internally disabled.
> `EPOLLEXCLUSIVE` | Wake only one epoll object when the associated fd has an event. The default (if this flag is not set) is to wake all epoll objects polling on an fd.
> `EPOLLRDHUP` | Потоковий сокет закрив однорангове з’єднання або завершив запис половини з’єднання.
> `EPOLLRDNORM` | Еквівалент `EPOLLIN`
> `EPOLLRDBAND` | Смугу пріоритетних даних можна зчитувати.
> `EPOLLWRNORM` | Equivalent to `EPOLLOUT`.
> `EPOLLWRBAND` | Пріоритетні дані можуть бути записані.
> `EPOLLMSG` | Ігнорується.
> `EPOLLWAKEUP` | Prevents sleep during event waiting.

> Added in version 3.6: `EPOLLEXCLUSIVE` додано. Він підтримується лише ядром Linux 4.5 або новішої версії.

> Added in version 3.14: `EPOLLWAKEUP` was added. It’s only supported by Linux Kernel 3.5 or later.

epoll.close()

  Закрийте дескриптор керуючого файлу об’єкта epoll.

epoll.closed

  `True`, якщо об’єкт epoll закрито.

epoll.fileno()

  Повертає номер дескриптора файлу елемента керування fd.

epoll.fromfd(fd)

  Створіть об’єкт epoll із заданого файлового дескриптора.

epoll.register(fd[, eventmask])

  Register a file descriptor fd with the epoll object.

epoll.modify(fd, eventmask)

  Modify a registered file descriptor fd.

epoll.unregister(fd)

  Видаліть зареєстрований дескриптор файлу з об’єкта epoll.

  Змінено в версії 3.9: Метод більше не ігнорує помилку `EBADF`.

epoll.poll(timeout=None, maxevents=-1)

  Wait for events. If timeout is given, it specifies the length of time in seconds (may be non-integer) which the system will wait for events before returning.

  Змінено в версії 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати `InterruptedError`.

  Змінено в версії 3.15: Accepts any real number as timeout, not only integer or float.

## Polling objects

The `poll()` system call, supported on most Unix systems, provides better scalability for network servers that service many, many clients at the same time. `poll()` scales better because the system call only requires listing the file descriptors of interest, while `select()` builds a bitmap, turns on bits for the fds of interest, and then afterward the whole bitmap has to be linearly scanned again. `select()` is O(highest file descriptor), while `poll()` is O(number of file descriptors).

poll.register(fd[, eventmask])

  Зареєструйте дескриптор файлу з об’єктом опитування. Подальші виклики методу `poll()` перевірятимуть, чи є в дескрипторі файлу будь-які незавершені події введення/виведення. fd може бути або цілим числом, або об’єктом із методом `fileno()`, який повертає ціле число. Файлові об’єкти реалізують `fileno()`, тому їх також можна використовувати як аргумент.

  eventmask — це необов’язкова бітова маска, що описує тип подій, які ви хочете перевірити, і може бути комбінацією констант `POLLIN`, `POLLPRI` і `POLLOUT`, описаних у таблицю нижче. Якщо не вказано, значення за умовчанням перевірятиме всі 3 типи подій.

  Постійний | Значення
  --- | ---
  `POLLIN` | There is data to read.
  `POLLPRI` | There is urgent data to read.
  `POLLOUT` | Ready for output: writing will not block.
  `POLLERR` | Error condition of some sort.
  `POLLHUP` | Hung up.
  `POLLRDHUP` | Stream socket peer closed connection, or shut down writing half of connection.
  `POLNVAL` | Invalid request: descriptor not open.

  Реєстрація дескриптора файлу, який уже зареєстровано, не є помилкою та має той самий ефект, що й одноразова реєстрація дескриптора.

poll.modify(fd, eventmask)

  Змінює вже зареєстрований fd. Це має той самий ефект, що й `register(fd, eventmask)`. Спроба змінити дескриптор файлу, який ніколи не був зареєстрований, викликає виняток `OSError` з errno `ENOENT`.

poll.unregister(fd)

  Видаліть дескриптор файлу, який відстежується об’єктом опитування. Як і метод `register()`, fd може бути цілим числом або об’єктом із методом `fileno()`, який повертає ціле число.

  Спроба видалити дескриптор файлу, який ніколи не був зареєстрований, викликає виняток `KeyError`.

poll.poll([timeout])

  Polls the set of registered file descriptors, and returns a possibly empty list containing `(fd, event)` 2-tuples for the descriptors that have events or errors to report. fd is the file descriptor, and event is a bitmask with bits set for the reported events for that descriptor — `POLLIN` for waiting input, `POLLOUT` to indicate that the descriptor can be written to, and so forth. An empty list indicates that the call timed out and no file descriptors had any events to report. If timeout is given, it specifies the length of time in milliseconds which the system will wait for events before returning. If timeout is omitted, negative, or `None`, the call will block until there is an event for this poll object.

  Змінено в версії 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати `InterruptedError`.

  Змінено в версії 3.15: Accepts any real number as timeout, not only integer or float. If `ppoll()` function is available, timeout has a resolution of `1` ns (`1e-6` ms) instead of `1` ms.

## Kqueue objects

kqueue.close()

  Закрийте дескриптор керуючого файлу об’єкта kqueue.

kqueue.closed

  `True`, якщо об’єкт kqueue закрито.

kqueue.fileno()

  Повертає номер дескриптора файлу елемента керування fd.

kqueue.fromfd(fd)

  Створіть об’єкт kqueue із заданого файлового дескриптора.

kqueue.control(changelist, max_events[, timeout]) → eventlist

  Низькорівневий інтерфейс для kevent

  - список змін має бути ітерованим об’єктами kevent або `None`

  - max_events має бути 0 або додатним цілим числом

  - timeout in seconds (non-integers are possible); the default is `None`, to wait forever

  Змінено в версії 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати `InterruptedError`.

  Змінено в версії 3.15: Accepts any real number as timeout, not only integer or float.

## Kevent objects

https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

kevent.ident

  Значення, що використовується для ідентифікації події. Інтерпретація залежить від фільтра, але зазвичай це дескриптор файлу. У конструкторі ident може бути або int, або об’єктом із методом `fileno()`. kevent зберігає ціле число всередині.

kevent.filter

  Назва фільтра ядра.

  Постійний | Значення
  --- | ---
  `KQ_FILTER_READ` | Takes a descriptor and returns whenever there is data available to read.
  `KQ_FILTER_WRITE` | Takes a descriptor and returns whenever there is data available to write.
  `KQ_FILTER_AIO` | AIO requests.
  `KQ_FILTER_VNODE` | Returns when one or more of the requested events watched in fflag occurs.
  `KQ_FILTER_PROC` | Watch for events on a process ID.
  `KQ_FILTER_NETDEV` | Watch for events on a network device (not available on macOS).
  `KQ_FILTER_SIGNAL` | Returns whenever the watched signal is delivered to the process.
  `KQ_FILTER_TIMER` | Establishes an arbitrary timer.

kevent.flags

  Дія фільтра.

  Постійний | Значення
  --- | ---
  `KQ_EV_ADD` | Adds or modifies an event.
  `KQ_EV_DELETE` | Removes an event from the queue.
  `KQ_EV_ENABLE` | Permits control() to return the event.
  `KQ_EV_DISABLE` | Disables event.
  `KQ_EV_ONESHOT` | Removes event after first occurrence.
  `KQ_EV_CLEAR` | Reset the state after an event is retrieved.
  `KQ_EV_SYSFLAGS` | Internal event.
  `KQ_EV_FLAG1` | Internal event.
  `KQ_EV_EOF` | Filter-specific EOF condition.
  `KQ_EV_ERROR` | See return values.

kevent.fflags

  Filter-specific flags.

  `KQ_FILTER_READ` і `KQ_FILTER_WRITE` позначки фільтрів:

  Постійний | Значення
  --- | ---
  `KQ_NOTE_LOWAT` | Low water mark of a socket buffer.

  `KQ_FILTER_VNODE` позначки фільтра:

  Постійний | Значення
  --- | ---
  `KQ_NOTE_DELETE` | unlink() was called.
  `KQ_NOTE_WRITE` | A write occurred.
  `KQ_NOTE_EXTEND` | The file was extended.
  `KQ_NOTE_ATTRIB` | An attribute was changed.
  `KQ_NOTE_LINK` | The link count has changed.
  `KQ_NOTE_RENAME` | The file was renamed.
  `KQ_NOTE_REVOKE` | Access to the file was revoked.

  `KQ_FILTER_PROC` позначки фільтра:

  Постійний | Значення
  --- | ---
  `KQ_NOTE_EXIT` | The process has exited.
  `KQ_NOTE_FORK` | The process has called fork().
  `KQ_NOTE_EXEC` | The process has executed a new process.
  `KQ_NOTE_PCTRLMASK` | Internal filter flag.
  `KQ_NOTE_PDATAMASK` | Internal filter flag.
  `KQ_NOTE_TRACK` | Follow a process across fork().
  `KQ_NOTE_CHILD` | Returned on the child process for NOTE_TRACK.
  `KQ_NOTE_TRACKERR` | Unable to attach to a child.

  `KQ_FILTER_NETDEV` позначки фільтра (недоступні в macOS):

  Постійний | Значення
  --- | ---
  `KQ_NOTE_LINKUP` | Link is up.
  `KQ_NOTE_LINKDOWN` | Link is down.
  `KQ_NOTE_LINKINV` | Link state is invalid.

kevent.data

  Filter-specific data.

kevent.udata

  User-defined value.