blob: bdefcf62a05d9e783d9bcd2891e125b06eae448d [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
Andrew Svetlov7c684072018-01-27 21:22:47 +0200357 async def sendfile(self, transport, file, offset=0, count=None,
358 *, fallback=True):
359 """Send a file through a transport.
360
361 Return an amount of sent bytes.
362 """
363 raise NotImplementedError
364
Yury Selivanovf111b3d2017-12-30 00:35:36 -0500365 async def start_tls(self, transport, protocol, sslcontext, *,
366 server_side=False,
367 server_hostname=None,
368 ssl_handshake_timeout=None):
369 """Upgrade a transport to TLS.
370
371 Return a new transport that *protocol* should start using
372 immediately.
373 """
374 raise NotImplementedError
375
Neil Aspinallf7686c12017-12-19 19:45:42 +0000376 async def create_unix_connection(
377 self, protocol_factory, path=None, *,
378 ssl=None, sock=None,
379 server_hostname=None,
Andrew Svetlov51eb1c62017-12-20 20:24:43 +0200380 ssl_handshake_timeout=None):
Yury Selivanovb057c522014-02-18 12:15:06 -0500381 raise NotImplementedError
382
Neil Aspinallf7686c12017-12-19 19:45:42 +0000383 async def create_unix_server(
384 self, protocol_factory, path=None, *,
385 sock=None, backlog=100, ssl=None,
Yury Selivanovc9070d02018-01-25 18:08:09 -0500386 ssl_handshake_timeout=None,
387 start_serving=True):
Yury Selivanovb057c522014-02-18 12:15:06 -0500388 """A coroutine which creates a UNIX Domain Socket server.
389
Yury Selivanovdec1a452014-02-18 22:27:48 -0500390 The return value is a Server object, which can be used to stop
Yury Selivanovb057c522014-02-18 12:15:06 -0500391 the service.
392
393 path is a str, representing a file systsem path to bind the
394 server socket to.
395
396 sock can optionally be specified in order to use a preexisting
397 socket object.
398
399 backlog is the maximum number of queued connections passed to
400 listen() (defaults to 100).
401
402 ssl can be set to an SSLContext to enable SSL over the
403 accepted connections.
Neil Aspinallf7686c12017-12-19 19:45:42 +0000404
405 ssl_handshake_timeout is the time in seconds that an SSL server
406 will wait for the SSL handshake to complete (defaults to 10s).
Yury Selivanovc9070d02018-01-25 18:08:09 -0500407
408 start_serving set to True (default) causes the created server
409 to start accepting connections immediately. When set to False,
410 the user should await Server.start_serving() or Server.serve_forever()
411 to make the server to start accepting connections.
Yury Selivanovb057c522014-02-18 12:15:06 -0500412 """
413 raise NotImplementedError
414
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200415 async def create_datagram_endpoint(self, protocol_factory,
416 local_addr=None, remote_addr=None, *,
417 family=0, proto=0, flags=0,
418 reuse_address=None, reuse_port=None,
419 allow_broadcast=None, sock=None):
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700420 """A coroutine which creates a datagram endpoint.
421
422 This method will try to establish the endpoint in the background.
423 When successful, the coroutine returns a (transport, protocol) pair.
424
425 protocol_factory must be a callable returning a protocol instance.
426
Quentin Dawansfe4ea9c2017-10-30 14:43:02 +0100427 socket family AF_INET, socket.AF_INET6 or socket.AF_UNIX depending on
428 host (or family if specified), socket type SOCK_DGRAM.
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700429
430 reuse_address tells the kernel to reuse a local socket in
431 TIME_WAIT state, without waiting for its natural timeout to
432 expire. If not specified it will automatically be set to True on
433 UNIX.
434
435 reuse_port tells the kernel to allow this endpoint to be bound to
436 the same port as other existing endpoints are bound to, so long as
437 they all set this flag when being created. This option is not
438 supported on Windows and some UNIX's. If the
439 :py:data:`~socket.SO_REUSEPORT` constant is not defined then this
440 capability is unsupported.
441
442 allow_broadcast tells the kernel to allow this endpoint to send
443 messages to the broadcast address.
444
445 sock can optionally be specified in order to use a preexisting
446 socket object.
447 """
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700448 raise NotImplementedError
449
Guido van Rossume3f52ef2013-11-01 14:19:04 -0700450 # Pipes and subprocesses.
451
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200452 async def connect_read_pipe(self, protocol_factory, pipe):
Victor Stinnera5b257a2014-05-29 00:14:03 +0200453 """Register read pipe in event loop. Set the pipe to non-blocking mode.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700454
455 protocol_factory should instantiate object with Protocol interface.
Victor Stinnera5b257a2014-05-29 00:14:03 +0200456 pipe is a file-like object.
457 Return pair (transport, protocol), where transport supports the
Guido van Rossum9204af42013-11-30 15:35:42 -0800458 ReadTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700459 # The reason to accept file-like object instead of just file descriptor
460 # is: we need to own pipe and close it at transport finishing
461 # Can got complicated errors if pass f.fileno(),
462 # close fd in pipe transport then close f and vise versa.
463 raise NotImplementedError
464
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200465 async def connect_write_pipe(self, protocol_factory, pipe):
Yury Selivanovdec1a452014-02-18 22:27:48 -0500466 """Register write pipe in event loop.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700467
468 protocol_factory should instantiate object with BaseProtocol interface.
469 Pipe is file-like object already switched to nonblocking.
470 Return pair (transport, protocol), where transport support
Guido van Rossum9204af42013-11-30 15:35:42 -0800471 WriteTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700472 # The reason to accept file-like object instead of just file descriptor
473 # is: we need to own pipe and close it at transport finishing
474 # Can got complicated errors if pass f.fileno(),
475 # close fd in pipe transport then close f and vise versa.
476 raise NotImplementedError
477
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200478 async def subprocess_shell(self, protocol_factory, cmd, *,
479 stdin=subprocess.PIPE,
480 stdout=subprocess.PIPE,
481 stderr=subprocess.PIPE,
482 **kwargs):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700483 raise NotImplementedError
484
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200485 async def subprocess_exec(self, protocol_factory, *args,
486 stdin=subprocess.PIPE,
487 stdout=subprocess.PIPE,
488 stderr=subprocess.PIPE,
489 **kwargs):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700490 raise NotImplementedError
491
492 # Ready-based callback registration methods.
493 # The add_*() methods return None.
494 # The remove_*() methods return True if something was removed,
495 # False if there was nothing to delete.
496
497 def add_reader(self, fd, callback, *args):
498 raise NotImplementedError
499
500 def remove_reader(self, fd):
501 raise NotImplementedError
502
503 def add_writer(self, fd, callback, *args):
504 raise NotImplementedError
505
506 def remove_writer(self, fd):
507 raise NotImplementedError
508
509 # Completion based I/O methods returning Futures.
510
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200511 async def sock_recv(self, sock, nbytes):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700512 raise NotImplementedError
513
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200514 async def sock_recv_into(self, sock, buf):
Antoine Pitrou525f40d2017-10-19 21:46:40 +0200515 raise NotImplementedError
516
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200517 async def sock_sendall(self, sock, data):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700518 raise NotImplementedError
519
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200520 async def sock_connect(self, sock, address):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700521 raise NotImplementedError
522
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200523 async def sock_accept(self, sock):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700524 raise NotImplementedError
525
Andrew Svetlov6b5a2792018-01-16 19:59:34 +0200526 async def sock_sendfile(self, sock, file, offset=0, count=None,
527 *, fallback=None):
528 raise NotImplementedError
529
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700530 # Signal handling.
531
532 def add_signal_handler(self, sig, callback, *args):
533 raise NotImplementedError
534
535 def remove_signal_handler(self, sig):
536 raise NotImplementedError
537
Yury Selivanov740169c2015-05-11 14:23:38 -0400538 # Task factory.
539
540 def set_task_factory(self, factory):
541 raise NotImplementedError
542
543 def get_task_factory(self):
544 raise NotImplementedError
545
Yury Selivanov569efa22014-02-18 18:02:19 -0500546 # Error handlers.
547
Yury Selivanov7ed7ce62016-05-16 15:20:38 -0400548 def get_exception_handler(self):
549 raise NotImplementedError
550
Yury Selivanov569efa22014-02-18 18:02:19 -0500551 def set_exception_handler(self, handler):
552 raise NotImplementedError
553
554 def default_exception_handler(self, context):
555 raise NotImplementedError
556
557 def call_exception_handler(self, context):
558 raise NotImplementedError
559
Victor Stinner0f3e6bc2014-02-19 23:15:02 +0100560 # Debug flag management.
561
562 def get_debug(self):
563 raise NotImplementedError
564
565 def set_debug(self, enabled):
566 raise NotImplementedError
567
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700568
569class AbstractEventLoopPolicy:
570 """Abstract policy for accessing the event loop."""
571
572 def get_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200573 """Get the event loop for the current context.
574
575 Returns an event loop object implementing the BaseEventLoop interface,
576 or raises an exception in case no event loop has been set for the
577 current context and the current policy does not specify to create one.
578
579 It should never return None."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700580 raise NotImplementedError
581
582 def set_event_loop(self, loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200583 """Set the event loop for the current context to loop."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700584 raise NotImplementedError
585
586 def new_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200587 """Create and return a new event loop object according to this
588 policy's rules. If there's need to set this loop as the event loop for
589 the current context, set_event_loop must be called explicitly."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700590 raise NotImplementedError
591
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800592 # Child processes handling (Unix only).
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700593
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800594 def get_child_watcher(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200595 "Get the watcher for child processes."
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800596 raise NotImplementedError
597
598 def set_child_watcher(self, watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200599 """Set the watcher for child processes."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800600 raise NotImplementedError
601
602
603class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700604 """Default policy implementation for accessing the event loop.
605
606 In this policy, each thread has its own event loop. However, we
607 only automatically create an event loop by default for the main
608 thread; other threads by default have no event loop.
609
610 Other policies may have different rules (e.g. a single global
611 event loop, or automatically creating an event loop per thread, or
612 using some other notion of context to which an event loop is
613 associated).
614 """
615
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800616 _loop_factory = None
617
618 class _Local(threading.local):
619 _loop = None
620 _set_called = False
621
622 def __init__(self):
623 self._local = self._Local()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700624
625 def get_event_loop(self):
626 """Get the event loop.
627
628 This may be None or an instance of EventLoop.
629 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800630 if (self._local._loop is None and
Yury Selivanov6370f342017-12-10 18:36:12 -0500631 not self._local._set_called and
632 isinstance(threading.current_thread(), threading._MainThread)):
Guido van Rossumcced0762013-11-27 10:37:13 -0800633 self.set_event_loop(self.new_event_loop())
Yury Selivanov6370f342017-12-10 18:36:12 -0500634
Victor Stinner3a1c7382014-12-18 01:20:10 +0100635 if self._local._loop is None:
636 raise RuntimeError('There is no current event loop in thread %r.'
637 % threading.current_thread().name)
Yury Selivanov6370f342017-12-10 18:36:12 -0500638
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800639 return self._local._loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700640
641 def set_event_loop(self, loop):
642 """Set the event loop."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800643 self._local._set_called = True
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700644 assert loop is None or isinstance(loop, AbstractEventLoop)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800645 self._local._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700646
647 def new_event_loop(self):
648 """Create a new event loop.
649
650 You must call set_event_loop() to make this the current event
651 loop.
652 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800653 return self._loop_factory()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700654
655
656# Event loop policy. The policy itself is always global, even if the
657# policy's rules say that there is an event loop per thread (or other
658# notion of context). The default policy is installed by the first
659# call to get_event_loop_policy().
660_event_loop_policy = None
661
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800662# Lock for protecting the on-the-fly creation of the event loop policy.
663_lock = threading.Lock()
664
665
Yury Selivanov600a3492016-11-04 14:29:28 -0400666# A TLS for the running event loop, used by _get_running_loop.
667class _RunningLoop(threading.local):
jimmylai80bbe6a72017-09-05 17:36:59 -0700668 loop_pid = (None, None)
Yury Selivanovba7e1f92017-03-02 20:07:11 -0500669
670
Yury Selivanov600a3492016-11-04 14:29:28 -0400671_running_loop = _RunningLoop()
672
673
Yury Selivanovabae67e2017-12-11 10:07:44 -0500674def get_running_loop():
675 """Return the running event loop. Raise a RuntimeError if there is none.
676
677 This function is thread-specific.
678 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500679 # NOTE: this function is implemented in C (see _asynciomodule.c)
Yury Selivanovabae67e2017-12-11 10:07:44 -0500680 loop = _get_running_loop()
681 if loop is None:
682 raise RuntimeError('no running event loop')
683 return loop
684
685
Yury Selivanov600a3492016-11-04 14:29:28 -0400686def _get_running_loop():
687 """Return the running event loop or None.
688
689 This is a low-level function intended to be used by event loops.
690 This function is thread-specific.
691 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500692 # NOTE: this function is implemented in C (see _asynciomodule.c)
jimmylai80bbe6a72017-09-05 17:36:59 -0700693 running_loop, pid = _running_loop.loop_pid
694 if running_loop is not None and pid == os.getpid():
Yury Selivanov902e9c52017-03-02 23:57:33 -0500695 return running_loop
Yury Selivanov600a3492016-11-04 14:29:28 -0400696
697
698def _set_running_loop(loop):
699 """Set the running event loop.
700
701 This is a low-level function intended to be used by event loops.
702 This function is thread-specific.
703 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500704 # NOTE: this function is implemented in C (see _asynciomodule.c)
jimmylai80bbe6a72017-09-05 17:36:59 -0700705 _running_loop.loop_pid = (loop, os.getpid())
Yury Selivanov600a3492016-11-04 14:29:28 -0400706
707
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800708def _init_event_loop_policy():
709 global _event_loop_policy
710 with _lock:
711 if _event_loop_policy is None: # pragma: no branch
712 from . import DefaultEventLoopPolicy
713 _event_loop_policy = DefaultEventLoopPolicy()
714
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700715
716def get_event_loop_policy():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200717 """Get the current event loop policy."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700718 if _event_loop_policy is None:
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800719 _init_event_loop_policy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700720 return _event_loop_policy
721
722
723def set_event_loop_policy(policy):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200724 """Set the current event loop policy.
725
726 If policy is None, the default policy is restored."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700727 global _event_loop_policy
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700728 assert policy is None or isinstance(policy, AbstractEventLoopPolicy)
729 _event_loop_policy = policy
730
731
732def get_event_loop():
Yury Selivanov600a3492016-11-04 14:29:28 -0400733 """Return an asyncio event loop.
734
735 When called from a coroutine or a callback (e.g. scheduled with call_soon
736 or similar API), this function will always return the running event loop.
737
738 If there is no running event loop set, the function will return
739 the result of `get_event_loop_policy().get_event_loop()` call.
740 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500741 # NOTE: this function is implemented in C (see _asynciomodule.c)
Yury Selivanov600a3492016-11-04 14:29:28 -0400742 current_loop = _get_running_loop()
743 if current_loop is not None:
744 return current_loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700745 return get_event_loop_policy().get_event_loop()
746
747
748def set_event_loop(loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200749 """Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700750 get_event_loop_policy().set_event_loop(loop)
751
752
753def new_event_loop():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200754 """Equivalent to calling get_event_loop_policy().new_event_loop()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700755 return get_event_loop_policy().new_event_loop()
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800756
757
758def get_child_watcher():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200759 """Equivalent to calling get_event_loop_policy().get_child_watcher()."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800760 return get_event_loop_policy().get_child_watcher()
761
762
763def set_child_watcher(watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200764 """Equivalent to calling
765 get_event_loop_policy().set_child_watcher(watcher)."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800766 return get_event_loop_policy().set_child_watcher(watcher)
Yury Selivanova70232f2017-12-13 14:49:42 -0500767
768
769# Alias pure-Python implementations for testing purposes.
770_py__get_running_loop = _get_running_loop
771_py__set_running_loop = _set_running_loop
772_py_get_running_loop = get_running_loop
773_py_get_event_loop = get_event_loop
774
775
776try:
777 # get_event_loop() is one of the most frequently called
778 # functions in asyncio. Pure Python implementation is
779 # about 4 times slower than C-accelerated.
780 from _asyncio import (_get_running_loop, _set_running_loop,
781 get_running_loop, get_event_loop)
782except ImportError:
783 pass
784else:
785 # Alias C implementations for testing purposes.
786 _c__get_running_loop = _get_running_loop
787 _c__set_running_loop = _set_running_loop
788 _c_get_running_loop = get_running_loop
789 _c_get_event_loop = get_event_loop