17db96d56Sopenharmony_ci:mod:`selectors` --- High-level I/O multiplexing
27db96d56Sopenharmony_ci================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: selectors
57db96d56Sopenharmony_ci   :synopsis: High-level I/O multiplexing.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. versionadded:: 3.4
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci**Source code:** :source:`Lib/selectors.py`
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci--------------
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ciIntroduction
147db96d56Sopenharmony_ci------------
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciThis module allows high-level and efficient I/O multiplexing, built upon the
177db96d56Sopenharmony_ci:mod:`select` module primitives. Users are encouraged to use this module
187db96d56Sopenharmony_ciinstead, unless they want precise control over the OS-level primitives used.
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciIt defines a :class:`BaseSelector` abstract base class, along with several
217db96d56Sopenharmony_ciconcrete implementations (:class:`KqueueSelector`, :class:`EpollSelector`...),
227db96d56Sopenharmony_cithat can be used to wait for I/O readiness notification on multiple file
237db96d56Sopenharmony_ciobjects. In the following, "file object" refers to any object with a
247db96d56Sopenharmony_ci:meth:`fileno()` method, or a raw file descriptor. See :term:`file object`.
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci:class:`DefaultSelector` is an alias to the most efficient implementation
277db96d56Sopenharmony_ciavailable on the current platform: this should be the default choice for most
287db96d56Sopenharmony_ciusers.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci.. note::
317db96d56Sopenharmony_ci   The type of file objects supported depends on the platform: on Windows,
327db96d56Sopenharmony_ci   sockets are supported, but not pipes, whereas on Unix, both are supported
337db96d56Sopenharmony_ci   (some other types may be supported as well, such as fifos or special file
347db96d56Sopenharmony_ci   devices).
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci.. seealso::
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci   :mod:`select`
397db96d56Sopenharmony_ci      Low-level I/O multiplexing module.
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci.. include:: ../includes/wasm-notavail.rst
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ciClasses
447db96d56Sopenharmony_ci-------
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ciClasses hierarchy::
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci   BaseSelector
497db96d56Sopenharmony_ci   +-- SelectSelector
507db96d56Sopenharmony_ci   +-- PollSelector
517db96d56Sopenharmony_ci   +-- EpollSelector
527db96d56Sopenharmony_ci   +-- DevpollSelector
537db96d56Sopenharmony_ci   +-- KqueueSelector
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ciIn the following, *events* is a bitwise mask indicating which I/O events should
577db96d56Sopenharmony_cibe waited for on a given file object. It can be a combination of the modules
587db96d56Sopenharmony_ciconstants below:
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci   +-----------------------+-----------------------------------------------+
617db96d56Sopenharmony_ci   | Constant              | Meaning                                       |
627db96d56Sopenharmony_ci   +=======================+===============================================+
637db96d56Sopenharmony_ci   | :const:`EVENT_READ`   | Available for read                            |
647db96d56Sopenharmony_ci   +-----------------------+-----------------------------------------------+
657db96d56Sopenharmony_ci   | :const:`EVENT_WRITE`  | Available for write                           |
667db96d56Sopenharmony_ci   +-----------------------+-----------------------------------------------+
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci.. class:: SelectorKey
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci   A :class:`SelectorKey` is a :class:`~collections.namedtuple` used to
727db96d56Sopenharmony_ci   associate a file object to its underlying file descriptor, selected event
737db96d56Sopenharmony_ci   mask and attached data. It is returned by several :class:`BaseSelector`
747db96d56Sopenharmony_ci   methods.
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci   .. attribute:: fileobj
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci      File object registered.
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci   .. attribute:: fd
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci      Underlying file descriptor.
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci   .. attribute:: events
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci      Events that must be waited for on this file object.
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci   .. attribute:: data
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci      Optional opaque data associated to this file object: for example, this
917db96d56Sopenharmony_ci      could be used to store a per-client session ID.
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci.. class:: BaseSelector
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci   A :class:`BaseSelector` is used to wait for I/O event readiness on multiple
977db96d56Sopenharmony_ci   file objects. It supports file stream registration, unregistration, and a
987db96d56Sopenharmony_ci   method to wait for I/O events on those streams, with an optional timeout.
997db96d56Sopenharmony_ci   It's an abstract base class, so cannot be instantiated. Use
1007db96d56Sopenharmony_ci   :class:`DefaultSelector` instead, or one of :class:`SelectSelector`,
1017db96d56Sopenharmony_ci   :class:`KqueueSelector` etc. if you want to specifically use an
1027db96d56Sopenharmony_ci   implementation, and your platform supports it.
1037db96d56Sopenharmony_ci   :class:`BaseSelector` and its concrete implementations support the
1047db96d56Sopenharmony_ci   :term:`context manager` protocol.
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci   .. abstractmethod:: register(fileobj, events, data=None)
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci      Register a file object for selection, monitoring it for I/O events.
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci      *fileobj* is the file object to monitor.  It may either be an integer
1117db96d56Sopenharmony_ci      file descriptor or an object with a ``fileno()`` method.
1127db96d56Sopenharmony_ci      *events* is a bitwise mask of events to monitor.
1137db96d56Sopenharmony_ci      *data* is an opaque object.
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci      This returns a new :class:`SelectorKey` instance, or raises a
1167db96d56Sopenharmony_ci      :exc:`ValueError` in case of invalid event mask or file descriptor, or
1177db96d56Sopenharmony_ci      :exc:`KeyError` if the file object is already registered.
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci   .. abstractmethod:: unregister(fileobj)
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci      Unregister a file object from selection, removing it from monitoring. A
1227db96d56Sopenharmony_ci      file object shall be unregistered prior to being closed.
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci      *fileobj* must be a file object previously registered.
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci      This returns the associated :class:`SelectorKey` instance, or raises a
1277db96d56Sopenharmony_ci      :exc:`KeyError` if *fileobj* is not registered.  It will raise
1287db96d56Sopenharmony_ci      :exc:`ValueError` if *fileobj* is invalid (e.g. it has no ``fileno()``
1297db96d56Sopenharmony_ci      method or its ``fileno()`` method has an invalid return value).
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci   .. method:: modify(fileobj, events, data=None)
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci      Change a registered file object's monitored events or attached data.
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci      This is equivalent to :meth:`BaseSelector.unregister(fileobj)` followed
1367db96d56Sopenharmony_ci      by :meth:`BaseSelector.register(fileobj, events, data)`, except that it
1377db96d56Sopenharmony_ci      can be implemented more efficiently.
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci      This returns a new :class:`SelectorKey` instance, or raises a
1407db96d56Sopenharmony_ci      :exc:`ValueError` in case of invalid event mask or file descriptor, or
1417db96d56Sopenharmony_ci      :exc:`KeyError` if the file object is not registered.
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci   .. abstractmethod:: select(timeout=None)
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci      Wait until some registered file objects become ready, or the timeout
1467db96d56Sopenharmony_ci      expires.
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci      If ``timeout > 0``, this specifies the maximum wait time, in seconds.
1497db96d56Sopenharmony_ci      If ``timeout <= 0``, the call won't block, and will report the currently
1507db96d56Sopenharmony_ci      ready file objects.
1517db96d56Sopenharmony_ci      If *timeout* is ``None``, the call will block until a monitored file object
1527db96d56Sopenharmony_ci      becomes ready.
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci      This returns a list of ``(key, events)`` tuples, one for each ready file
1557db96d56Sopenharmony_ci      object.
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci      *key* is the :class:`SelectorKey` instance corresponding to a ready file
1587db96d56Sopenharmony_ci      object.
1597db96d56Sopenharmony_ci      *events* is a bitmask of events ready on this file object.
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci      .. note::
1627db96d56Sopenharmony_ci          This method can return before any file object becomes ready or the
1637db96d56Sopenharmony_ci          timeout has elapsed if the current process receives a signal: in this
1647db96d56Sopenharmony_ci          case, an empty list will be returned.
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci      .. versionchanged:: 3.5
1677db96d56Sopenharmony_ci         The selector is now retried with a recomputed timeout when interrupted
1687db96d56Sopenharmony_ci         by a signal if the signal handler did not raise an exception (see
1697db96d56Sopenharmony_ci         :pep:`475` for the rationale), instead of returning an empty list
1707db96d56Sopenharmony_ci         of events before the timeout.
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci   .. method:: close()
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci      Close the selector.
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci      This must be called to make sure that any underlying resource is freed.
1777db96d56Sopenharmony_ci      The selector shall not be used once it has been closed.
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci   .. method:: get_key(fileobj)
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci      Return the key associated with a registered file object.
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci      This returns the :class:`SelectorKey` instance associated to this file
1847db96d56Sopenharmony_ci      object, or raises :exc:`KeyError` if the file object is not registered.
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci   .. abstractmethod:: get_map()
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci      Return a mapping of file objects to selector keys.
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci      This returns a :class:`~collections.abc.Mapping` instance mapping
1917db96d56Sopenharmony_ci      registered file objects to their associated :class:`SelectorKey`
1927db96d56Sopenharmony_ci      instance.
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci.. class:: DefaultSelector()
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci   The default selector class, using the most efficient implementation
1987db96d56Sopenharmony_ci   available on the current platform. This should be the default choice for
1997db96d56Sopenharmony_ci   most users.
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci.. class:: SelectSelector()
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci   :func:`select.select`-based selector.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci.. class:: PollSelector()
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci   :func:`select.poll`-based selector.
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci.. class:: EpollSelector()
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci   :func:`select.epoll`-based selector.
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci   .. method:: fileno()
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci      This returns the file descriptor used by the underlying
2197db96d56Sopenharmony_ci      :func:`select.epoll` object.
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci.. class:: DevpollSelector()
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ci   :func:`select.devpoll`-based selector.
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci   .. method:: fileno()
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci      This returns the file descriptor used by the underlying
2287db96d56Sopenharmony_ci      :func:`select.devpoll` object.
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   .. versionadded:: 3.5
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci.. class:: KqueueSelector()
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci   :func:`select.kqueue`-based selector.
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci   .. method:: fileno()
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci      This returns the file descriptor used by the underlying
2397db96d56Sopenharmony_ci      :func:`select.kqueue` object.
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ciExamples
2437db96d56Sopenharmony_ci--------
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ciHere is a simple echo server implementation::
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci   import selectors
2487db96d56Sopenharmony_ci   import socket
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci   sel = selectors.DefaultSelector()
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci   def accept(sock, mask):
2537db96d56Sopenharmony_ci       conn, addr = sock.accept()  # Should be ready
2547db96d56Sopenharmony_ci       print('accepted', conn, 'from', addr)
2557db96d56Sopenharmony_ci       conn.setblocking(False)
2567db96d56Sopenharmony_ci       sel.register(conn, selectors.EVENT_READ, read)
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci   def read(conn, mask):
2597db96d56Sopenharmony_ci       data = conn.recv(1000)  # Should be ready
2607db96d56Sopenharmony_ci       if data:
2617db96d56Sopenharmony_ci           print('echoing', repr(data), 'to', conn)
2627db96d56Sopenharmony_ci           conn.send(data)  # Hope it won't block
2637db96d56Sopenharmony_ci       else:
2647db96d56Sopenharmony_ci           print('closing', conn)
2657db96d56Sopenharmony_ci           sel.unregister(conn)
2667db96d56Sopenharmony_ci           conn.close()
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci   sock = socket.socket()
2697db96d56Sopenharmony_ci   sock.bind(('localhost', 1234))
2707db96d56Sopenharmony_ci   sock.listen(100)
2717db96d56Sopenharmony_ci   sock.setblocking(False)
2727db96d56Sopenharmony_ci   sel.register(sock, selectors.EVENT_READ, accept)
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci   while True:
2757db96d56Sopenharmony_ci       events = sel.select()
2767db96d56Sopenharmony_ci       for key, mask in events:
2777db96d56Sopenharmony_ci           callback = key.data
2787db96d56Sopenharmony_ci           callback(key.fileobj, mask)
279