• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1:mod:`selectors` --- High-level I/O multiplexing
2================================================
3
4.. module:: selectors
5   :synopsis: High-level I/O multiplexing.
6
7.. versionadded:: 3.4
8
9**Source code:** :source:`Lib/selectors.py`
10
11--------------
12
13Introduction
14------------
15
16This module allows high-level and efficient I/O multiplexing, built upon the
17:mod:`select` module primitives. Users are encouraged to use this module
18instead, unless they want precise control over the OS-level primitives used.
19
20It defines a :class:`BaseSelector` abstract base class, along with several
21concrete implementations (:class:`KqueueSelector`, :class:`EpollSelector`...),
22that can be used to wait for I/O readiness notification on multiple file
23objects. In the following, "file object" refers to any object with a
24:meth:`fileno()` method, or a raw file descriptor. See :term:`file object`.
25
26:class:`DefaultSelector` is an alias to the most efficient implementation
27available on the current platform: this should be the default choice for most
28users.
29
30.. note::
31   The type of file objects supported depends on the platform: on Windows,
32   sockets are supported, but not pipes, whereas on Unix, both are supported
33   (some other types may be supported as well, such as fifos or special file
34   devices).
35
36.. seealso::
37
38   :mod:`select`
39      Low-level I/O multiplexing module.
40
41
42Classes
43-------
44
45Classes hierarchy::
46
47   BaseSelector
48   +-- SelectSelector
49   +-- PollSelector
50   +-- EpollSelector
51   +-- DevpollSelector
52   +-- KqueueSelector
53
54
55In the following, *events* is a bitwise mask indicating which I/O events should
56be waited for on a given file object. It can be a combination of the modules
57constants below:
58
59   +-----------------------+-----------------------------------------------+
60   | Constant              | Meaning                                       |
61   +=======================+===============================================+
62   | :const:`EVENT_READ`   | Available for read                            |
63   +-----------------------+-----------------------------------------------+
64   | :const:`EVENT_WRITE`  | Available for write                           |
65   +-----------------------+-----------------------------------------------+
66
67
68.. class:: SelectorKey
69
70   A :class:`SelectorKey` is a :class:`~collections.namedtuple` used to
71   associate a file object to its underlying file descriptor, selected event
72   mask and attached data. It is returned by several :class:`BaseSelector`
73   methods.
74
75   .. attribute:: fileobj
76
77      File object registered.
78
79   .. attribute:: fd
80
81      Underlying file descriptor.
82
83   .. attribute:: events
84
85      Events that must be waited for on this file object.
86
87   .. attribute:: data
88
89      Optional opaque data associated to this file object: for example, this
90      could be used to store a per-client session ID.
91
92
93.. class:: BaseSelector
94
95   A :class:`BaseSelector` is used to wait for I/O event readiness on multiple
96   file objects. It supports file stream registration, unregistration, and a
97   method to wait for I/O events on those streams, with an optional timeout.
98   It's an abstract base class, so cannot be instantiated. Use
99   :class:`DefaultSelector` instead, or one of :class:`SelectSelector`,
100   :class:`KqueueSelector` etc. if you want to specifically use an
101   implementation, and your platform supports it.
102   :class:`BaseSelector` and its concrete implementations support the
103   :term:`context manager` protocol.
104
105   .. abstractmethod:: register(fileobj, events, data=None)
106
107      Register a file object for selection, monitoring it for I/O events.
108
109      *fileobj* is the file object to monitor.  It may either be an integer
110      file descriptor or an object with a ``fileno()`` method.
111      *events* is a bitwise mask of events to monitor.
112      *data* is an opaque object.
113
114      This returns a new :class:`SelectorKey` instance, or raises a
115      :exc:`ValueError` in case of invalid event mask or file descriptor, or
116      :exc:`KeyError` if the file object is already registered.
117
118   .. abstractmethod:: unregister(fileobj)
119
120      Unregister a file object from selection, removing it from monitoring. A
121      file object shall be unregistered prior to being closed.
122
123      *fileobj* must be a file object previously registered.
124
125      This returns the associated :class:`SelectorKey` instance, or raises a
126      :exc:`KeyError` if *fileobj* is not registered.  It will raise
127      :exc:`ValueError` if *fileobj* is invalid (e.g. it has no ``fileno()``
128      method or its ``fileno()`` method has an invalid return value).
129
130   .. method:: modify(fileobj, events, data=None)
131
132      Change a registered file object's monitored events or attached data.
133
134      This is equivalent to :meth:`BaseSelector.unregister(fileobj)` followed
135      by :meth:`BaseSelector.register(fileobj, events, data)`, except that it
136      can be implemented more efficiently.
137
138      This returns a new :class:`SelectorKey` instance, or raises a
139      :exc:`ValueError` in case of invalid event mask or file descriptor, or
140      :exc:`KeyError` if the file object is not registered.
141
142   .. abstractmethod:: select(timeout=None)
143
144      Wait until some registered file objects become ready, or the timeout
145      expires.
146
147      If ``timeout > 0``, this specifies the maximum wait time, in seconds.
148      If ``timeout <= 0``, the call won't block, and will report the currently
149      ready file objects.
150      If *timeout* is ``None``, the call will block until a monitored file object
151      becomes ready.
152
153      This returns a list of ``(key, events)`` tuples, one for each ready file
154      object.
155
156      *key* is the :class:`SelectorKey` instance corresponding to a ready file
157      object.
158      *events* is a bitmask of events ready on this file object.
159
160      .. note::
161          This method can return before any file object becomes ready or the
162          timeout has elapsed if the current process receives a signal: in this
163          case, an empty list will be returned.
164
165      .. versionchanged:: 3.5
166         The selector is now retried with a recomputed timeout when interrupted
167         by a signal if the signal handler did not raise an exception (see
168         :pep:`475` for the rationale), instead of returning an empty list
169         of events before the timeout.
170
171   .. method:: close()
172
173      Close the selector.
174
175      This must be called to make sure that any underlying resource is freed.
176      The selector shall not be used once it has been closed.
177
178   .. method:: get_key(fileobj)
179
180      Return the key associated with a registered file object.
181
182      This returns the :class:`SelectorKey` instance associated to this file
183      object, or raises :exc:`KeyError` if the file object is not registered.
184
185   .. abstractmethod:: get_map()
186
187      Return a mapping of file objects to selector keys.
188
189      This returns a :class:`~collections.abc.Mapping` instance mapping
190      registered file objects to their associated :class:`SelectorKey`
191      instance.
192
193
194.. class:: DefaultSelector()
195
196   The default selector class, using the most efficient implementation
197   available on the current platform. This should be the default choice for
198   most users.
199
200
201.. class:: SelectSelector()
202
203   :func:`select.select`-based selector.
204
205
206.. class:: PollSelector()
207
208   :func:`select.poll`-based selector.
209
210
211.. class:: EpollSelector()
212
213   :func:`select.epoll`-based selector.
214
215   .. method:: fileno()
216
217      This returns the file descriptor used by the underlying
218      :func:`select.epoll` object.
219
220.. class:: DevpollSelector()
221
222   :func:`select.devpoll`-based selector.
223
224   .. method:: fileno()
225
226      This returns the file descriptor used by the underlying
227      :func:`select.devpoll` object.
228
229   .. versionadded:: 3.5
230
231.. class:: KqueueSelector()
232
233   :func:`select.kqueue`-based selector.
234
235   .. method:: fileno()
236
237      This returns the file descriptor used by the underlying
238      :func:`select.kqueue` object.
239
240
241Examples
242--------
243
244Here is a simple echo server implementation::
245
246   import selectors
247   import socket
248
249   sel = selectors.DefaultSelector()
250
251   def accept(sock, mask):
252       conn, addr = sock.accept()  # Should be ready
253       print('accepted', conn, 'from', addr)
254       conn.setblocking(False)
255       sel.register(conn, selectors.EVENT_READ, read)
256
257   def read(conn, mask):
258       data = conn.recv(1000)  # Should be ready
259       if data:
260           print('echoing', repr(data), 'to', conn)
261           conn.send(data)  # Hope it won't block
262       else:
263           print('closing', conn)
264           sel.unregister(conn)
265           conn.close()
266
267   sock = socket.socket()
268   sock.bind(('localhost', 1234))
269   sock.listen(100)
270   sock.setblocking(False)
271   sel.register(sock, selectors.EVENT_READ, accept)
272
273   while True:
274       events = sel.select()
275       for key, mask in events:
276           callback = key.data
277           callback(key.fileobj, mask)
278