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