blob: 7aa3de02c958f4e55fbe62e0c6ba20e25f79bbfe [file] [log] [blame]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001"""Event loop and event loop policy."""
2
Yury Selivanov6370f342017-12-10 18:36:12 -05003__all__ = (
4 'AbstractEventLoopPolicy',
5 'AbstractEventLoop', 'AbstractServer',
Andrew Svetlov7464e872018-01-19 20:04:29 +02006 'Handle', 'TimerHandle', 'SendfileNotAvailableError',
Yury Selivanov6370f342017-12-10 18:36:12 -05007 'get_event_loop_policy', 'set_event_loop_policy',
8 'get_event_loop', 'set_event_loop', 'new_event_loop',
9 'get_child_watcher', 'set_child_watcher',
Yury Selivanovabae67e2017-12-11 10:07:44 -050010 '_set_running_loop', 'get_running_loop',
11 '_get_running_loop',
Yury Selivanov6370f342017-12-10 18:36:12 -050012)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070013
Yury Selivanovf23746a2018-01-22 19:11:18 -050014import contextvars
Yury Selivanovba7e1f92017-03-02 20:07:11 -050015import os
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070016import socket
Victor Stinner313a9802014-07-29 12:58:23 +020017import subprocess
Victor Stinner307bccc2014-06-12 18:39:26 +020018import sys
Victor Stinner313a9802014-07-29 12:58:23 +020019import threading
Victor Stinner307bccc2014-06-12 18:39:26 +020020
Andrew Svetlovf74ef452017-12-15 07:04:38 +020021from . import format_helpers
Antoine Pitrou921e9432017-11-07 17:23:29 +010022
23
Andrew Svetlov7464e872018-01-19 20:04:29 +020024class SendfileNotAvailableError(RuntimeError):
25 """Sendfile syscall is not available.
26
27 Raised if OS does not support senfile syscall for given socket or
28 file type.
29 """
30
31
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070032class Handle:
33 """Object returned by callback registration methods."""
34
Victor Stinner80f53aa2014-06-27 13:52:20 +020035 __slots__ = ('_callback', '_args', '_cancelled', '_loop',
Yury Selivanovf23746a2018-01-22 19:11:18 -050036 '_source_traceback', '_repr', '__weakref__',
37 '_context')
Yury Selivanovb1317782014-02-12 17:01:52 -050038
Yury Selivanovf23746a2018-01-22 19:11:18 -050039 def __init__(self, callback, args, loop, context=None):
40 if context is None:
41 context = contextvars.copy_context()
42 self._context = context
Yury Selivanov569efa22014-02-18 18:02:19 -050043 self._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070044 self._callback = callback
45 self._args = args
46 self._cancelled = False
Victor Stinner1b38bc62014-09-17 23:24:13 +020047 self._repr = None
Victor Stinner80f53aa2014-06-27 13:52:20 +020048 if self._loop.get_debug():
Andrew Svetlovf74ef452017-12-15 07:04:38 +020049 self._source_traceback = format_helpers.extract_stack(
50 sys._getframe(1))
Victor Stinner80f53aa2014-06-27 13:52:20 +020051 else:
52 self._source_traceback = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070053
Victor Stinner1b38bc62014-09-17 23:24:13 +020054 def _repr_info(self):
Victor Stinnerf68bd882014-07-10 22:32:58 +020055 info = [self.__class__.__name__]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070056 if self._cancelled:
Victor Stinner975735f2014-06-25 21:41:58 +020057 info.append('cancelled')
Victor Stinnerf68bd882014-07-10 22:32:58 +020058 if self._callback is not None:
Andrew Svetlovf74ef452017-12-15 07:04:38 +020059 info.append(format_helpers._format_callback_source(
60 self._callback, self._args))
Victor Stinnerf68bd882014-07-10 22:32:58 +020061 if self._source_traceback:
62 frame = self._source_traceback[-1]
Yury Selivanov6370f342017-12-10 18:36:12 -050063 info.append(f'created at {frame[0]}:{frame[1]}')
Victor Stinner1b38bc62014-09-17 23:24:13 +020064 return info
65
66 def __repr__(self):
67 if self._repr is not None:
68 return self._repr
69 info = self._repr_info()
Yury Selivanov6370f342017-12-10 18:36:12 -050070 return '<{}>'.format(' '.join(info))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070071
72 def cancel(self):
Yury Selivanov592ada92014-09-25 12:07:56 -040073 if not self._cancelled:
74 self._cancelled = True
75 if self._loop.get_debug():
76 # Keep a representation in debug mode to keep callback and
77 # parameters. For example, to log the warning
78 # "Executing <Handle...> took 2.5 second"
79 self._repr = repr(self)
80 self._callback = None
81 self._args = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070082
Marat Sharafutdinov69cfed12017-11-07 12:06:05 +030083 def cancelled(self):
84 return self._cancelled
85
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070086 def _run(self):
87 try:
Yury Selivanovf23746a2018-01-22 19:11:18 -050088 self._context.run(self._callback, *self._args)
Yury Selivanov569efa22014-02-18 18:02:19 -050089 except Exception as exc:
Andrew Svetlovf74ef452017-12-15 07:04:38 +020090 cb = format_helpers._format_callback_source(
91 self._callback, self._args)
Yury Selivanov6370f342017-12-10 18:36:12 -050092 msg = f'Exception in callback {cb}'
Victor Stinner80f53aa2014-06-27 13:52:20 +020093 context = {
Yury Selivanov569efa22014-02-18 18:02:19 -050094 'message': msg,
95 'exception': exc,
96 'handle': self,
Victor Stinner80f53aa2014-06-27 13:52:20 +020097 }
98 if self._source_traceback:
99 context['source_traceback'] = self._source_traceback
100 self._loop.call_exception_handler(context)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700101 self = None # Needed to break cycles when an exception occurs.
102
103
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700104class TimerHandle(Handle):
105 """Object returned by timed callback registration methods."""
106
Yury Selivanov592ada92014-09-25 12:07:56 -0400107 __slots__ = ['_scheduled', '_when']
Yury Selivanovb1317782014-02-12 17:01:52 -0500108
Yury Selivanovf23746a2018-01-22 19:11:18 -0500109 def __init__(self, when, callback, args, loop, context=None):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700110 assert when is not None
Yury Selivanovf23746a2018-01-22 19:11:18 -0500111 super().__init__(callback, args, loop, context)
Victor Stinner80f53aa2014-06-27 13:52:20 +0200112 if self._source_traceback:
113 del self._source_traceback[-1]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700114 self._when = when
Yury Selivanov592ada92014-09-25 12:07:56 -0400115 self._scheduled = False
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700116
Victor Stinner1b38bc62014-09-17 23:24:13 +0200117 def _repr_info(self):
118 info = super()._repr_info()
119 pos = 2 if self._cancelled else 1
Yury Selivanov6370f342017-12-10 18:36:12 -0500120 info.insert(pos, f'when={self._when}')
Victor Stinner1b38bc62014-09-17 23:24:13 +0200121 return info
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700122
123 def __hash__(self):
124 return hash(self._when)
125
126 def __lt__(self, other):
127 return self._when < other._when
128
129 def __le__(self, other):
130 if self._when < other._when:
131 return True
132 return self.__eq__(other)
133
134 def __gt__(self, other):
135 return self._when > other._when
136
137 def __ge__(self, other):
138 if self._when > other._when:
139 return True
140 return self.__eq__(other)
141
142 def __eq__(self, other):
143 if isinstance(other, TimerHandle):
144 return (self._when == other._when and
145 self._callback == other._callback and
146 self._args == other._args and
147 self._cancelled == other._cancelled)
148 return NotImplemented
149
150 def __ne__(self, other):
151 equal = self.__eq__(other)
152 return NotImplemented if equal is NotImplemented else not equal
153
Yury Selivanov592ada92014-09-25 12:07:56 -0400154 def cancel(self):
155 if not self._cancelled:
156 self._loop._timer_handle_cancelled(self)
157 super().cancel()
158
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700159
160class AbstractServer:
Victor Stinnercf6f72e2013-12-03 18:23:52 +0100161 """Abstract server returned by create_server()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700162
163 def close(self):
164 """Stop serving. This leaves existing connections open."""
Andrew Svetlovffcb4c02017-12-30 18:52:56 +0200165 raise NotImplementedError
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700166
Yury Selivanovc9070d02018-01-25 18:08:09 -0500167 def get_loop(self):
168 """Get the event loop the Server object is attached to."""
169 raise NotImplementedError
170
171 def is_serving(self):
172 """Return True if the server is accepting connections."""
173 raise NotImplementedError
174
175 async def start_serving(self):
176 """Start accepting connections.
177
178 This method is idempotent, so it can be called when
179 the server is already being serving.
180 """
181 raise NotImplementedError
182
183 async def serve_forever(self):
184 """Start accepting connections until the coroutine is cancelled.
185
186 The server is closed when the coroutine is cancelled.
187 """
188 raise NotImplementedError
189
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200190 async def wait_closed(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700191 """Coroutine to wait until service is closed."""
Andrew Svetlovffcb4c02017-12-30 18:52:56 +0200192 raise NotImplementedError
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700193
Yury Selivanovc9070d02018-01-25 18:08:09 -0500194 async def __aenter__(self):
195 return self
196
197 async def __aexit__(self, *exc):
198 self.close()
199 await self.wait_closed()
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)1634fc22017-12-30 20:39:32 +0530200
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700201
202class AbstractEventLoop:
203 """Abstract event loop."""
204
205 # Running and stopping the event loop.
206
207 def run_forever(self):
208 """Run the event loop until stop() is called."""
209 raise NotImplementedError
210
211 def run_until_complete(self, future):
212 """Run the event loop until a Future is done.
213
214 Return the Future's result, or raise its exception.
215 """
216 raise NotImplementedError
217
218 def stop(self):
219 """Stop the event loop as soon as reasonable.
220
221 Exactly how soon that is may depend on the implementation, but
222 no more I/O callbacks should be scheduled.
223 """
224 raise NotImplementedError
225
226 def is_running(self):
227 """Return whether the event loop is currently running."""
228 raise NotImplementedError
229
Victor Stinner896a25a2014-07-08 11:29:25 +0200230 def is_closed(self):
231 """Returns True if the event loop was closed."""
232 raise NotImplementedError
233
Guido van Rossume3f52ef2013-11-01 14:19:04 -0700234 def close(self):
235 """Close the loop.
236
237 The loop should not be running.
238
239 This is idempotent and irreversible.
240
241 No other methods should be called after this one.
242 """
243 raise NotImplementedError
244
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200245 async def shutdown_asyncgens(self):
Yury Selivanovf6d991d2016-09-15 13:10:51 -0400246 """Shutdown all active asynchronous generators."""
247 raise NotImplementedError
248
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700249 # Methods scheduling callbacks. All these return Handles.
250
Yury Selivanov592ada92014-09-25 12:07:56 -0400251 def _timer_handle_cancelled(self, handle):
252 """Notification that a TimerHandle has been cancelled."""
253 raise NotImplementedError
254
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700255 def call_soon(self, callback, *args):
256 return self.call_later(0, callback, *args)
257
258 def call_later(self, delay, callback, *args):
259 raise NotImplementedError
260
261 def call_at(self, when, callback, *args):
262 raise NotImplementedError
263
264 def time(self):
265 raise NotImplementedError
266
Yury Selivanov7661db62016-05-16 15:38:39 -0400267 def create_future(self):
268 raise NotImplementedError
269
Victor Stinner896a25a2014-07-08 11:29:25 +0200270 # Method scheduling a coroutine object: create a task.
271
272 def create_task(self, coro):
273 raise NotImplementedError
274
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700275 # Methods for interacting with threads.
276
277 def call_soon_threadsafe(self, callback, *args):
278 raise NotImplementedError
279
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200280 async def run_in_executor(self, executor, func, *args):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700281 raise NotImplementedError
282
283 def set_default_executor(self, executor):
284 raise NotImplementedError
285
286 # Network I/O methods returning Futures.
287
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200288 async def getaddrinfo(self, host, port, *,
289 family=0, type=0, proto=0, flags=0):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700290 raise NotImplementedError
291
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200292 async def getnameinfo(self, sockaddr, flags=0):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700293 raise NotImplementedError
294
Neil Aspinallf7686c12017-12-19 19:45:42 +0000295 async def create_connection(
296 self, protocol_factory, host=None, port=None,
297 *, ssl=None, family=0, proto=0,
298 flags=0, sock=None, local_addr=None,
299 server_hostname=None,
Andrew Svetlov51eb1c62017-12-20 20:24:43 +0200300 ssl_handshake_timeout=None):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700301 raise NotImplementedError
302
Neil Aspinallf7686c12017-12-19 19:45:42 +0000303 async def create_server(
304 self, protocol_factory, host=None, port=None,
305 *, family=socket.AF_UNSPEC,
306 flags=socket.AI_PASSIVE, sock=None, backlog=100,
307 ssl=None, reuse_address=None, reuse_port=None,
Yury Selivanovc9070d02018-01-25 18:08:09 -0500308 ssl_handshake_timeout=None,
309 start_serving=True):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700310 """A coroutine which creates a TCP server bound to host and port.
311
312 The return value is a Server object which can be used to stop
313 the service.
314
315 If host is an empty string or None all interfaces are assumed
316 and a list of multiple sockets will be returned (most likely
Yury Selivanov6370f342017-12-10 18:36:12 -0500317 one for IPv4 and another one for IPv6). The host parameter can also be
318 a sequence (e.g. list) of hosts to bind to.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700319
320 family can be set to either AF_INET or AF_INET6 to force the
321 socket to use IPv4 or IPv6. If not set it will be determined
322 from host (defaults to AF_UNSPEC).
323
324 flags is a bitmask for getaddrinfo().
325
326 sock can optionally be specified in order to use a preexisting
327 socket object.
328
329 backlog is the maximum number of queued connections passed to
330 listen() (defaults to 100).
331
332 ssl can be set to an SSLContext to enable SSL over the
333 accepted connections.
334
335 reuse_address tells the kernel to reuse a local socket in
336 TIME_WAIT state, without waiting for its natural timeout to
337 expire. If not specified will automatically be set to True on
338 UNIX.
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700339
340 reuse_port tells the kernel to allow this endpoint to be bound to
341 the same port as other existing endpoints are bound to, so long as
342 they all set this flag when being created. This option is not
343 supported on Windows.
Neil Aspinallf7686c12017-12-19 19:45:42 +0000344
345 ssl_handshake_timeout is the time in seconds that an SSL server
346 will wait for completion of the SSL handshake before aborting the
347 connection. Default is 10s, longer timeouts may increase vulnerability
348 to DoS attacks (see https://support.f5.com/csp/article/K13834)
Yury Selivanovc9070d02018-01-25 18:08:09 -0500349
350 start_serving set to True (default) causes the created server
351 to start accepting connections immediately. When set to False,
352 the user should await Server.start_serving() or Server.serve_forever()
353 to make the server to start accepting connections.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700354 """
355 raise NotImplementedError
356
Yury Selivanovf111b3d2017-12-30 00:35:36 -0500357 async def start_tls(self, transport, protocol, sslcontext, *,
358 server_side=False,
359 server_hostname=None,
360 ssl_handshake_timeout=None):
361 """Upgrade a transport to TLS.
362
363 Return a new transport that *protocol* should start using
364 immediately.
365 """
366 raise NotImplementedError
367
Neil Aspinallf7686c12017-12-19 19:45:42 +0000368 async def create_unix_connection(
369 self, protocol_factory, path=None, *,
370 ssl=None, sock=None,
371 server_hostname=None,
Andrew Svetlov51eb1c62017-12-20 20:24:43 +0200372 ssl_handshake_timeout=None):
Yury Selivanovb057c522014-02-18 12:15:06 -0500373 raise NotImplementedError
374
Neil Aspinallf7686c12017-12-19 19:45:42 +0000375 async def create_unix_server(
376 self, protocol_factory, path=None, *,
377 sock=None, backlog=100, ssl=None,
Yury Selivanovc9070d02018-01-25 18:08:09 -0500378 ssl_handshake_timeout=None,
379 start_serving=True):
Yury Selivanovb057c522014-02-18 12:15:06 -0500380 """A coroutine which creates a UNIX Domain Socket server.
381
Yury Selivanovdec1a452014-02-18 22:27:48 -0500382 The return value is a Server object, which can be used to stop
Yury Selivanovb057c522014-02-18 12:15:06 -0500383 the service.
384
385 path is a str, representing a file systsem path to bind the
386 server socket to.
387
388 sock can optionally be specified in order to use a preexisting
389 socket object.
390
391 backlog is the maximum number of queued connections passed to
392 listen() (defaults to 100).
393
394 ssl can be set to an SSLContext to enable SSL over the
395 accepted connections.
Neil Aspinallf7686c12017-12-19 19:45:42 +0000396
397 ssl_handshake_timeout is the time in seconds that an SSL server
398 will wait for the SSL handshake to complete (defaults to 10s).
Yury Selivanovc9070d02018-01-25 18:08:09 -0500399
400 start_serving set to True (default) causes the created server
401 to start accepting connections immediately. When set to False,
402 the user should await Server.start_serving() or Server.serve_forever()
403 to make the server to start accepting connections.
Yury Selivanovb057c522014-02-18 12:15:06 -0500404 """
405 raise NotImplementedError
406
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200407 async def create_datagram_endpoint(self, protocol_factory,
408 local_addr=None, remote_addr=None, *,
409 family=0, proto=0, flags=0,
410 reuse_address=None, reuse_port=None,
411 allow_broadcast=None, sock=None):
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700412 """A coroutine which creates a datagram endpoint.
413
414 This method will try to establish the endpoint in the background.
415 When successful, the coroutine returns a (transport, protocol) pair.
416
417 protocol_factory must be a callable returning a protocol instance.
418
Quentin Dawansfe4ea9c2017-10-30 14:43:02 +0100419 socket family AF_INET, socket.AF_INET6 or socket.AF_UNIX depending on
420 host (or family if specified), socket type SOCK_DGRAM.
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700421
422 reuse_address tells the kernel to reuse a local socket in
423 TIME_WAIT state, without waiting for its natural timeout to
424 expire. If not specified it will automatically be set to True on
425 UNIX.
426
427 reuse_port tells the kernel to allow this endpoint to be bound to
428 the same port as other existing endpoints are bound to, so long as
429 they all set this flag when being created. This option is not
430 supported on Windows and some UNIX's. If the
431 :py:data:`~socket.SO_REUSEPORT` constant is not defined then this
432 capability is unsupported.
433
434 allow_broadcast tells the kernel to allow this endpoint to send
435 messages to the broadcast address.
436
437 sock can optionally be specified in order to use a preexisting
438 socket object.
439 """
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700440 raise NotImplementedError
441
Guido van Rossume3f52ef2013-11-01 14:19:04 -0700442 # Pipes and subprocesses.
443
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200444 async def connect_read_pipe(self, protocol_factory, pipe):
Victor Stinnera5b257a2014-05-29 00:14:03 +0200445 """Register read pipe in event loop. Set the pipe to non-blocking mode.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700446
447 protocol_factory should instantiate object with Protocol interface.
Victor Stinnera5b257a2014-05-29 00:14:03 +0200448 pipe is a file-like object.
449 Return pair (transport, protocol), where transport supports the
Guido van Rossum9204af42013-11-30 15:35:42 -0800450 ReadTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700451 # The reason to accept file-like object instead of just file descriptor
452 # is: we need to own pipe and close it at transport finishing
453 # Can got complicated errors if pass f.fileno(),
454 # close fd in pipe transport then close f and vise versa.
455 raise NotImplementedError
456
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200457 async def connect_write_pipe(self, protocol_factory, pipe):
Yury Selivanovdec1a452014-02-18 22:27:48 -0500458 """Register write pipe in event loop.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700459
460 protocol_factory should instantiate object with BaseProtocol interface.
461 Pipe is file-like object already switched to nonblocking.
462 Return pair (transport, protocol), where transport support
Guido van Rossum9204af42013-11-30 15:35:42 -0800463 WriteTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700464 # The reason to accept file-like object instead of just file descriptor
465 # is: we need to own pipe and close it at transport finishing
466 # Can got complicated errors if pass f.fileno(),
467 # close fd in pipe transport then close f and vise versa.
468 raise NotImplementedError
469
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200470 async def subprocess_shell(self, protocol_factory, cmd, *,
471 stdin=subprocess.PIPE,
472 stdout=subprocess.PIPE,
473 stderr=subprocess.PIPE,
474 **kwargs):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700475 raise NotImplementedError
476
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200477 async def subprocess_exec(self, protocol_factory, *args,
478 stdin=subprocess.PIPE,
479 stdout=subprocess.PIPE,
480 stderr=subprocess.PIPE,
481 **kwargs):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700482 raise NotImplementedError
483
484 # Ready-based callback registration methods.
485 # The add_*() methods return None.
486 # The remove_*() methods return True if something was removed,
487 # False if there was nothing to delete.
488
489 def add_reader(self, fd, callback, *args):
490 raise NotImplementedError
491
492 def remove_reader(self, fd):
493 raise NotImplementedError
494
495 def add_writer(self, fd, callback, *args):
496 raise NotImplementedError
497
498 def remove_writer(self, fd):
499 raise NotImplementedError
500
501 # Completion based I/O methods returning Futures.
502
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200503 async def sock_recv(self, sock, nbytes):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700504 raise NotImplementedError
505
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200506 async def sock_recv_into(self, sock, buf):
Antoine Pitrou525f40d2017-10-19 21:46:40 +0200507 raise NotImplementedError
508
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200509 async def sock_sendall(self, sock, data):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700510 raise NotImplementedError
511
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200512 async def sock_connect(self, sock, address):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700513 raise NotImplementedError
514
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200515 async def sock_accept(self, sock):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700516 raise NotImplementedError
517
Andrew Svetlov6b5a2792018-01-16 19:59:34 +0200518 async def sock_sendfile(self, sock, file, offset=0, count=None,
519 *, fallback=None):
520 raise NotImplementedError
521
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700522 # Signal handling.
523
524 def add_signal_handler(self, sig, callback, *args):
525 raise NotImplementedError
526
527 def remove_signal_handler(self, sig):
528 raise NotImplementedError
529
Yury Selivanov740169c2015-05-11 14:23:38 -0400530 # Task factory.
531
532 def set_task_factory(self, factory):
533 raise NotImplementedError
534
535 def get_task_factory(self):
536 raise NotImplementedError
537
Yury Selivanov569efa22014-02-18 18:02:19 -0500538 # Error handlers.
539
Yury Selivanov7ed7ce62016-05-16 15:20:38 -0400540 def get_exception_handler(self):
541 raise NotImplementedError
542
Yury Selivanov569efa22014-02-18 18:02:19 -0500543 def set_exception_handler(self, handler):
544 raise NotImplementedError
545
546 def default_exception_handler(self, context):
547 raise NotImplementedError
548
549 def call_exception_handler(self, context):
550 raise NotImplementedError
551
Victor Stinner0f3e6bc2014-02-19 23:15:02 +0100552 # Debug flag management.
553
554 def get_debug(self):
555 raise NotImplementedError
556
557 def set_debug(self, enabled):
558 raise NotImplementedError
559
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700560
561class AbstractEventLoopPolicy:
562 """Abstract policy for accessing the event loop."""
563
564 def get_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200565 """Get the event loop for the current context.
566
567 Returns an event loop object implementing the BaseEventLoop interface,
568 or raises an exception in case no event loop has been set for the
569 current context and the current policy does not specify to create one.
570
571 It should never return None."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700572 raise NotImplementedError
573
574 def set_event_loop(self, loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200575 """Set the event loop for the current context to loop."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700576 raise NotImplementedError
577
578 def new_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200579 """Create and return a new event loop object according to this
580 policy's rules. If there's need to set this loop as the event loop for
581 the current context, set_event_loop must be called explicitly."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700582 raise NotImplementedError
583
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800584 # Child processes handling (Unix only).
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700585
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800586 def get_child_watcher(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200587 "Get the watcher for child processes."
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800588 raise NotImplementedError
589
590 def set_child_watcher(self, watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200591 """Set the watcher for child processes."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800592 raise NotImplementedError
593
594
595class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700596 """Default policy implementation for accessing the event loop.
597
598 In this policy, each thread has its own event loop. However, we
599 only automatically create an event loop by default for the main
600 thread; other threads by default have no event loop.
601
602 Other policies may have different rules (e.g. a single global
603 event loop, or automatically creating an event loop per thread, or
604 using some other notion of context to which an event loop is
605 associated).
606 """
607
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800608 _loop_factory = None
609
610 class _Local(threading.local):
611 _loop = None
612 _set_called = False
613
614 def __init__(self):
615 self._local = self._Local()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700616
617 def get_event_loop(self):
618 """Get the event loop.
619
620 This may be None or an instance of EventLoop.
621 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800622 if (self._local._loop is None and
Yury Selivanov6370f342017-12-10 18:36:12 -0500623 not self._local._set_called and
624 isinstance(threading.current_thread(), threading._MainThread)):
Guido van Rossumcced0762013-11-27 10:37:13 -0800625 self.set_event_loop(self.new_event_loop())
Yury Selivanov6370f342017-12-10 18:36:12 -0500626
Victor Stinner3a1c7382014-12-18 01:20:10 +0100627 if self._local._loop is None:
628 raise RuntimeError('There is no current event loop in thread %r.'
629 % threading.current_thread().name)
Yury Selivanov6370f342017-12-10 18:36:12 -0500630
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800631 return self._local._loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700632
633 def set_event_loop(self, loop):
634 """Set the event loop."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800635 self._local._set_called = True
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700636 assert loop is None or isinstance(loop, AbstractEventLoop)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800637 self._local._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700638
639 def new_event_loop(self):
640 """Create a new event loop.
641
642 You must call set_event_loop() to make this the current event
643 loop.
644 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800645 return self._loop_factory()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700646
647
648# Event loop policy. The policy itself is always global, even if the
649# policy's rules say that there is an event loop per thread (or other
650# notion of context). The default policy is installed by the first
651# call to get_event_loop_policy().
652_event_loop_policy = None
653
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800654# Lock for protecting the on-the-fly creation of the event loop policy.
655_lock = threading.Lock()
656
657
Yury Selivanov600a3492016-11-04 14:29:28 -0400658# A TLS for the running event loop, used by _get_running_loop.
659class _RunningLoop(threading.local):
jimmylai80bbe6a72017-09-05 17:36:59 -0700660 loop_pid = (None, None)
Yury Selivanovba7e1f92017-03-02 20:07:11 -0500661
662
Yury Selivanov600a3492016-11-04 14:29:28 -0400663_running_loop = _RunningLoop()
664
665
Yury Selivanovabae67e2017-12-11 10:07:44 -0500666def get_running_loop():
667 """Return the running event loop. Raise a RuntimeError if there is none.
668
669 This function is thread-specific.
670 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500671 # NOTE: this function is implemented in C (see _asynciomodule.c)
Yury Selivanovabae67e2017-12-11 10:07:44 -0500672 loop = _get_running_loop()
673 if loop is None:
674 raise RuntimeError('no running event loop')
675 return loop
676
677
Yury Selivanov600a3492016-11-04 14:29:28 -0400678def _get_running_loop():
679 """Return the running event loop or None.
680
681 This is a low-level function intended to be used by event loops.
682 This function is thread-specific.
683 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500684 # NOTE: this function is implemented in C (see _asynciomodule.c)
jimmylai80bbe6a72017-09-05 17:36:59 -0700685 running_loop, pid = _running_loop.loop_pid
686 if running_loop is not None and pid == os.getpid():
Yury Selivanov902e9c52017-03-02 23:57:33 -0500687 return running_loop
Yury Selivanov600a3492016-11-04 14:29:28 -0400688
689
690def _set_running_loop(loop):
691 """Set the running event loop.
692
693 This is a low-level function intended to be used by event loops.
694 This function is thread-specific.
695 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500696 # NOTE: this function is implemented in C (see _asynciomodule.c)
jimmylai80bbe6a72017-09-05 17:36:59 -0700697 _running_loop.loop_pid = (loop, os.getpid())
Yury Selivanov600a3492016-11-04 14:29:28 -0400698
699
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800700def _init_event_loop_policy():
701 global _event_loop_policy
702 with _lock:
703 if _event_loop_policy is None: # pragma: no branch
704 from . import DefaultEventLoopPolicy
705 _event_loop_policy = DefaultEventLoopPolicy()
706
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700707
708def get_event_loop_policy():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200709 """Get the current event loop policy."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700710 if _event_loop_policy is None:
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800711 _init_event_loop_policy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700712 return _event_loop_policy
713
714
715def set_event_loop_policy(policy):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200716 """Set the current event loop policy.
717
718 If policy is None, the default policy is restored."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700719 global _event_loop_policy
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700720 assert policy is None or isinstance(policy, AbstractEventLoopPolicy)
721 _event_loop_policy = policy
722
723
724def get_event_loop():
Yury Selivanov600a3492016-11-04 14:29:28 -0400725 """Return an asyncio event loop.
726
727 When called from a coroutine or a callback (e.g. scheduled with call_soon
728 or similar API), this function will always return the running event loop.
729
730 If there is no running event loop set, the function will return
731 the result of `get_event_loop_policy().get_event_loop()` call.
732 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500733 # NOTE: this function is implemented in C (see _asynciomodule.c)
Yury Selivanov600a3492016-11-04 14:29:28 -0400734 current_loop = _get_running_loop()
735 if current_loop is not None:
736 return current_loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700737 return get_event_loop_policy().get_event_loop()
738
739
740def set_event_loop(loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200741 """Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700742 get_event_loop_policy().set_event_loop(loop)
743
744
745def new_event_loop():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200746 """Equivalent to calling get_event_loop_policy().new_event_loop()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700747 return get_event_loop_policy().new_event_loop()
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800748
749
750def get_child_watcher():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200751 """Equivalent to calling get_event_loop_policy().get_child_watcher()."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800752 return get_event_loop_policy().get_child_watcher()
753
754
755def set_child_watcher(watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200756 """Equivalent to calling
757 get_event_loop_policy().set_child_watcher(watcher)."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800758 return get_event_loop_policy().set_child_watcher(watcher)
Yury Selivanova70232f2017-12-13 14:49:42 -0500759
760
761# Alias pure-Python implementations for testing purposes.
762_py__get_running_loop = _get_running_loop
763_py__set_running_loop = _set_running_loop
764_py_get_running_loop = get_running_loop
765_py_get_event_loop = get_event_loop
766
767
768try:
769 # get_event_loop() is one of the most frequently called
770 # functions in asyncio. Pure Python implementation is
771 # about 4 times slower than C-accelerated.
772 from _asyncio import (_get_running_loop, _set_running_loop,
773 get_running_loop, get_event_loop)
774except ImportError:
775 pass
776else:
777 # Alias C implementations for testing purposes.
778 _c__get_running_loop = _get_running_loop
779 _c__set_running_loop = _set_running_loop
780 _c_get_running_loop = get_running_loop
781 _c_get_event_loop = get_event_loop