blob: d381b1c596239ce4540927e5b0d301886f4530ca [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 Svetlov0baa72f2018-09-11 10:13:04 -07006 'Handle', 'TimerHandle',
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
Andrew Svetlov0baa72f2018-09-11 10:13:04 -070022from . import exceptions
Andrew Svetlov7464e872018-01-19 20:04:29 +020023
24
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070025class Handle:
26 """Object returned by callback registration methods."""
27
Victor Stinner80f53aa2014-06-27 13:52:20 +020028 __slots__ = ('_callback', '_args', '_cancelled', '_loop',
Yury Selivanovf23746a2018-01-22 19:11:18 -050029 '_source_traceback', '_repr', '__weakref__',
30 '_context')
Yury Selivanovb1317782014-02-12 17:01:52 -050031
Yury Selivanovf23746a2018-01-22 19:11:18 -050032 def __init__(self, callback, args, loop, context=None):
33 if context is None:
34 context = contextvars.copy_context()
35 self._context = context
Yury Selivanov569efa22014-02-18 18:02:19 -050036 self._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070037 self._callback = callback
38 self._args = args
39 self._cancelled = False
Victor Stinner1b38bc62014-09-17 23:24:13 +020040 self._repr = None
Victor Stinner80f53aa2014-06-27 13:52:20 +020041 if self._loop.get_debug():
Andrew Svetlovf74ef452017-12-15 07:04:38 +020042 self._source_traceback = format_helpers.extract_stack(
43 sys._getframe(1))
Victor Stinner80f53aa2014-06-27 13:52:20 +020044 else:
45 self._source_traceback = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070046
Victor Stinner1b38bc62014-09-17 23:24:13 +020047 def _repr_info(self):
Victor Stinnerf68bd882014-07-10 22:32:58 +020048 info = [self.__class__.__name__]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070049 if self._cancelled:
Victor Stinner975735f2014-06-25 21:41:58 +020050 info.append('cancelled')
Victor Stinnerf68bd882014-07-10 22:32:58 +020051 if self._callback is not None:
Andrew Svetlovf74ef452017-12-15 07:04:38 +020052 info.append(format_helpers._format_callback_source(
53 self._callback, self._args))
Victor Stinnerf68bd882014-07-10 22:32:58 +020054 if self._source_traceback:
55 frame = self._source_traceback[-1]
Yury Selivanov6370f342017-12-10 18:36:12 -050056 info.append(f'created at {frame[0]}:{frame[1]}')
Victor Stinner1b38bc62014-09-17 23:24:13 +020057 return info
58
59 def __repr__(self):
60 if self._repr is not None:
61 return self._repr
62 info = self._repr_info()
Yury Selivanov6370f342017-12-10 18:36:12 -050063 return '<{}>'.format(' '.join(info))
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070064
65 def cancel(self):
Yury Selivanov592ada92014-09-25 12:07:56 -040066 if not self._cancelled:
67 self._cancelled = True
68 if self._loop.get_debug():
69 # Keep a representation in debug mode to keep callback and
70 # parameters. For example, to log the warning
71 # "Executing <Handle...> took 2.5 second"
72 self._repr = repr(self)
73 self._callback = None
74 self._args = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070075
Marat Sharafutdinov69cfed12017-11-07 12:06:05 +030076 def cancelled(self):
77 return self._cancelled
78
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070079 def _run(self):
80 try:
Yury Selivanovf23746a2018-01-22 19:11:18 -050081 self._context.run(self._callback, *self._args)
Yury Selivanov431b5402019-05-27 14:45:12 +020082 except (SystemExit, KeyboardInterrupt):
83 raise
84 except BaseException as exc:
Andrew Svetlovf74ef452017-12-15 07:04:38 +020085 cb = format_helpers._format_callback_source(
86 self._callback, self._args)
Yury Selivanov6370f342017-12-10 18:36:12 -050087 msg = f'Exception in callback {cb}'
Victor Stinner80f53aa2014-06-27 13:52:20 +020088 context = {
Yury Selivanov569efa22014-02-18 18:02:19 -050089 'message': msg,
90 'exception': exc,
91 'handle': self,
Victor Stinner80f53aa2014-06-27 13:52:20 +020092 }
93 if self._source_traceback:
94 context['source_traceback'] = self._source_traceback
95 self._loop.call_exception_handler(context)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070096 self = None # Needed to break cycles when an exception occurs.
97
98
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070099class TimerHandle(Handle):
100 """Object returned by timed callback registration methods."""
101
Yury Selivanov592ada92014-09-25 12:07:56 -0400102 __slots__ = ['_scheduled', '_when']
Yury Selivanovb1317782014-02-12 17:01:52 -0500103
Yury Selivanovf23746a2018-01-22 19:11:18 -0500104 def __init__(self, when, callback, args, loop, context=None):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700105 assert when is not None
Yury Selivanovf23746a2018-01-22 19:11:18 -0500106 super().__init__(callback, args, loop, context)
Victor Stinner80f53aa2014-06-27 13:52:20 +0200107 if self._source_traceback:
108 del self._source_traceback[-1]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700109 self._when = when
Yury Selivanov592ada92014-09-25 12:07:56 -0400110 self._scheduled = False
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700111
Victor Stinner1b38bc62014-09-17 23:24:13 +0200112 def _repr_info(self):
113 info = super()._repr_info()
114 pos = 2 if self._cancelled else 1
Yury Selivanov6370f342017-12-10 18:36:12 -0500115 info.insert(pos, f'when={self._when}')
Victor Stinner1b38bc62014-09-17 23:24:13 +0200116 return info
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700117
118 def __hash__(self):
119 return hash(self._when)
120
121 def __lt__(self, other):
122 return self._when < other._when
123
124 def __le__(self, other):
125 if self._when < other._when:
126 return True
127 return self.__eq__(other)
128
129 def __gt__(self, other):
130 return self._when > other._when
131
132 def __ge__(self, other):
133 if self._when > other._when:
134 return True
135 return self.__eq__(other)
136
137 def __eq__(self, other):
138 if isinstance(other, TimerHandle):
139 return (self._when == other._when and
140 self._callback == other._callback and
141 self._args == other._args and
142 self._cancelled == other._cancelled)
143 return NotImplemented
144
145 def __ne__(self, other):
146 equal = self.__eq__(other)
147 return NotImplemented if equal is NotImplemented else not equal
148
Yury Selivanov592ada92014-09-25 12:07:56 -0400149 def cancel(self):
150 if not self._cancelled:
151 self._loop._timer_handle_cancelled(self)
152 super().cancel()
153
Andrew Svetlov3d4dbd82018-02-01 19:59:32 +0200154 def when(self):
155 """Return a scheduled callback time.
156
157 The time is an absolute timestamp, using the same time
158 reference as loop.time().
159 """
160 return self._when
161
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700162
163class AbstractServer:
Victor Stinnercf6f72e2013-12-03 18:23:52 +0100164 """Abstract server returned by create_server()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700165
166 def close(self):
167 """Stop serving. This leaves existing connections open."""
Andrew Svetlovffcb4c02017-12-30 18:52:56 +0200168 raise NotImplementedError
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700169
Yury Selivanovc9070d02018-01-25 18:08:09 -0500170 def get_loop(self):
171 """Get the event loop the Server object is attached to."""
172 raise NotImplementedError
173
174 def is_serving(self):
175 """Return True if the server is accepting connections."""
176 raise NotImplementedError
177
178 async def start_serving(self):
179 """Start accepting connections.
180
181 This method is idempotent, so it can be called when
182 the server is already being serving.
183 """
184 raise NotImplementedError
185
186 async def serve_forever(self):
187 """Start accepting connections until the coroutine is cancelled.
188
189 The server is closed when the coroutine is cancelled.
190 """
191 raise NotImplementedError
192
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200193 async def wait_closed(self):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700194 """Coroutine to wait until service is closed."""
Andrew Svetlovffcb4c02017-12-30 18:52:56 +0200195 raise NotImplementedError
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700196
Yury Selivanovc9070d02018-01-25 18:08:09 -0500197 async def __aenter__(self):
198 return self
199
200 async def __aexit__(self, *exc):
201 self.close()
202 await self.wait_closed()
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)1634fc22017-12-30 20:39:32 +0530203
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700204
205class AbstractEventLoop:
206 """Abstract event loop."""
207
208 # Running and stopping the event loop.
209
210 def run_forever(self):
211 """Run the event loop until stop() is called."""
212 raise NotImplementedError
213
214 def run_until_complete(self, future):
215 """Run the event loop until a Future is done.
216
217 Return the Future's result, or raise its exception.
218 """
219 raise NotImplementedError
220
221 def stop(self):
222 """Stop the event loop as soon as reasonable.
223
224 Exactly how soon that is may depend on the implementation, but
225 no more I/O callbacks should be scheduled.
226 """
227 raise NotImplementedError
228
229 def is_running(self):
230 """Return whether the event loop is currently running."""
231 raise NotImplementedError
232
Victor Stinner896a25a2014-07-08 11:29:25 +0200233 def is_closed(self):
234 """Returns True if the event loop was closed."""
235 raise NotImplementedError
236
Guido van Rossume3f52ef2013-11-01 14:19:04 -0700237 def close(self):
238 """Close the loop.
239
240 The loop should not be running.
241
242 This is idempotent and irreversible.
243
244 No other methods should be called after this one.
245 """
246 raise NotImplementedError
247
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200248 async def shutdown_asyncgens(self):
Yury Selivanovf6d991d2016-09-15 13:10:51 -0400249 """Shutdown all active asynchronous generators."""
250 raise NotImplementedError
251
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700252 # Methods scheduling callbacks. All these return Handles.
253
Yury Selivanov592ada92014-09-25 12:07:56 -0400254 def _timer_handle_cancelled(self, handle):
255 """Notification that a TimerHandle has been cancelled."""
256 raise NotImplementedError
257
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700258 def call_soon(self, callback, *args):
259 return self.call_later(0, callback, *args)
260
261 def call_later(self, delay, callback, *args):
262 raise NotImplementedError
263
264 def call_at(self, when, callback, *args):
265 raise NotImplementedError
266
267 def time(self):
268 raise NotImplementedError
269
Yury Selivanov7661db62016-05-16 15:38:39 -0400270 def create_future(self):
271 raise NotImplementedError
272
Victor Stinner896a25a2014-07-08 11:29:25 +0200273 # Method scheduling a coroutine object: create a task.
274
Alex Grönholmcca4eec2018-08-09 00:06:47 +0300275 def create_task(self, coro, *, name=None):
Victor Stinner896a25a2014-07-08 11:29:25 +0200276 raise NotImplementedError
277
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700278 # Methods for interacting with threads.
279
280 def call_soon_threadsafe(self, callback, *args):
281 raise NotImplementedError
282
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200283 async def run_in_executor(self, executor, func, *args):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700284 raise NotImplementedError
285
286 def set_default_executor(self, executor):
287 raise NotImplementedError
288
289 # Network I/O methods returning Futures.
290
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200291 async def getaddrinfo(self, host, port, *,
292 family=0, type=0, proto=0, flags=0):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700293 raise NotImplementedError
294
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200295 async def getnameinfo(self, sockaddr, flags=0):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700296 raise NotImplementedError
297
Neil Aspinallf7686c12017-12-19 19:45:42 +0000298 async def create_connection(
299 self, protocol_factory, host=None, port=None,
300 *, ssl=None, family=0, proto=0,
301 flags=0, sock=None, local_addr=None,
302 server_hostname=None,
twisteroid ambassador88f07a82019-05-05 19:14:35 +0800303 ssl_handshake_timeout=None,
304 happy_eyeballs_delay=None, interleave=None):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700305 raise NotImplementedError
306
Neil Aspinallf7686c12017-12-19 19:45:42 +0000307 async def create_server(
308 self, protocol_factory, host=None, port=None,
309 *, family=socket.AF_UNSPEC,
310 flags=socket.AI_PASSIVE, sock=None, backlog=100,
311 ssl=None, reuse_address=None, reuse_port=None,
Yury Selivanovc9070d02018-01-25 18:08:09 -0500312 ssl_handshake_timeout=None,
313 start_serving=True):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700314 """A coroutine which creates a TCP server bound to host and port.
315
316 The return value is a Server object which can be used to stop
317 the service.
318
319 If host is an empty string or None all interfaces are assumed
320 and a list of multiple sockets will be returned (most likely
Yury Selivanov6370f342017-12-10 18:36:12 -0500321 one for IPv4 and another one for IPv6). The host parameter can also be
322 a sequence (e.g. list) of hosts to bind to.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700323
324 family can be set to either AF_INET or AF_INET6 to force the
325 socket to use IPv4 or IPv6. If not set it will be determined
326 from host (defaults to AF_UNSPEC).
327
328 flags is a bitmask for getaddrinfo().
329
330 sock can optionally be specified in order to use a preexisting
331 socket object.
332
333 backlog is the maximum number of queued connections passed to
334 listen() (defaults to 100).
335
336 ssl can be set to an SSLContext to enable SSL over the
337 accepted connections.
338
339 reuse_address tells the kernel to reuse a local socket in
340 TIME_WAIT state, without waiting for its natural timeout to
341 expire. If not specified will automatically be set to True on
342 UNIX.
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700343
344 reuse_port tells the kernel to allow this endpoint to be bound to
345 the same port as other existing endpoints are bound to, so long as
346 they all set this flag when being created. This option is not
347 supported on Windows.
Neil Aspinallf7686c12017-12-19 19:45:42 +0000348
349 ssl_handshake_timeout is the time in seconds that an SSL server
350 will wait for completion of the SSL handshake before aborting the
Yury Selivanov96026432018-06-04 11:32:35 -0400351 connection. Default is 60s.
Yury Selivanovc9070d02018-01-25 18:08:09 -0500352
353 start_serving set to True (default) causes the created server
354 to start accepting connections immediately. When set to False,
355 the user should await Server.start_serving() or Server.serve_forever()
356 to make the server to start accepting connections.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700357 """
358 raise NotImplementedError
359
Andrew Svetlov7c684072018-01-27 21:22:47 +0200360 async def sendfile(self, transport, file, offset=0, count=None,
361 *, fallback=True):
362 """Send a file through a transport.
363
364 Return an amount of sent bytes.
365 """
366 raise NotImplementedError
367
Yury Selivanovf111b3d2017-12-30 00:35:36 -0500368 async def start_tls(self, transport, protocol, sslcontext, *,
369 server_side=False,
370 server_hostname=None,
371 ssl_handshake_timeout=None):
372 """Upgrade a transport to TLS.
373
374 Return a new transport that *protocol* should start using
375 immediately.
376 """
377 raise NotImplementedError
378
Neil Aspinallf7686c12017-12-19 19:45:42 +0000379 async def create_unix_connection(
380 self, protocol_factory, path=None, *,
381 ssl=None, sock=None,
382 server_hostname=None,
Andrew Svetlov51eb1c62017-12-20 20:24:43 +0200383 ssl_handshake_timeout=None):
Yury Selivanovb057c522014-02-18 12:15:06 -0500384 raise NotImplementedError
385
Neil Aspinallf7686c12017-12-19 19:45:42 +0000386 async def create_unix_server(
387 self, protocol_factory, path=None, *,
388 sock=None, backlog=100, ssl=None,
Yury Selivanovc9070d02018-01-25 18:08:09 -0500389 ssl_handshake_timeout=None,
390 start_serving=True):
Yury Selivanovb057c522014-02-18 12:15:06 -0500391 """A coroutine which creates a UNIX Domain Socket server.
392
Yury Selivanovdec1a452014-02-18 22:27:48 -0500393 The return value is a Server object, which can be used to stop
Yury Selivanovb057c522014-02-18 12:15:06 -0500394 the service.
395
396 path is a str, representing a file systsem path to bind the
397 server socket to.
398
399 sock can optionally be specified in order to use a preexisting
400 socket object.
401
402 backlog is the maximum number of queued connections passed to
403 listen() (defaults to 100).
404
405 ssl can be set to an SSLContext to enable SSL over the
406 accepted connections.
Neil Aspinallf7686c12017-12-19 19:45:42 +0000407
408 ssl_handshake_timeout is the time in seconds that an SSL server
Yury Selivanov96026432018-06-04 11:32:35 -0400409 will wait for the SSL handshake to complete (defaults to 60s).
Yury Selivanovc9070d02018-01-25 18:08:09 -0500410
411 start_serving set to True (default) causes the created server
412 to start accepting connections immediately. When set to False,
413 the user should await Server.start_serving() or Server.serve_forever()
414 to make the server to start accepting connections.
Yury Selivanovb057c522014-02-18 12:15:06 -0500415 """
416 raise NotImplementedError
417
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200418 async def create_datagram_endpoint(self, protocol_factory,
419 local_addr=None, remote_addr=None, *,
420 family=0, proto=0, flags=0,
421 reuse_address=None, reuse_port=None,
422 allow_broadcast=None, sock=None):
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700423 """A coroutine which creates a datagram endpoint.
424
425 This method will try to establish the endpoint in the background.
426 When successful, the coroutine returns a (transport, protocol) pair.
427
428 protocol_factory must be a callable returning a protocol instance.
429
Quentin Dawansfe4ea9c2017-10-30 14:43:02 +0100430 socket family AF_INET, socket.AF_INET6 or socket.AF_UNIX depending on
431 host (or family if specified), socket type SOCK_DGRAM.
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700432
433 reuse_address tells the kernel to reuse a local socket in
434 TIME_WAIT state, without waiting for its natural timeout to
435 expire. If not specified it will automatically be set to True on
436 UNIX.
437
438 reuse_port tells the kernel to allow this endpoint to be bound to
439 the same port as other existing endpoints are bound to, so long as
440 they all set this flag when being created. This option is not
441 supported on Windows and some UNIX's. If the
442 :py:data:`~socket.SO_REUSEPORT` constant is not defined then this
443 capability is unsupported.
444
445 allow_broadcast tells the kernel to allow this endpoint to send
446 messages to the broadcast address.
447
448 sock can optionally be specified in order to use a preexisting
449 socket object.
450 """
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700451 raise NotImplementedError
452
Guido van Rossume3f52ef2013-11-01 14:19:04 -0700453 # Pipes and subprocesses.
454
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200455 async def connect_read_pipe(self, protocol_factory, pipe):
Victor Stinnera5b257a2014-05-29 00:14:03 +0200456 """Register read pipe in event loop. Set the pipe to non-blocking mode.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700457
458 protocol_factory should instantiate object with Protocol interface.
Victor Stinnera5b257a2014-05-29 00:14:03 +0200459 pipe is a file-like object.
460 Return pair (transport, protocol), where transport supports the
Guido van Rossum9204af42013-11-30 15:35:42 -0800461 ReadTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700462 # The reason to accept file-like object instead of just file descriptor
463 # is: we need to own pipe and close it at transport finishing
464 # Can got complicated errors if pass f.fileno(),
465 # close fd in pipe transport then close f and vise versa.
466 raise NotImplementedError
467
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200468 async def connect_write_pipe(self, protocol_factory, pipe):
Yury Selivanovdec1a452014-02-18 22:27:48 -0500469 """Register write pipe in event loop.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700470
471 protocol_factory should instantiate object with BaseProtocol interface.
472 Pipe is file-like object already switched to nonblocking.
473 Return pair (transport, protocol), where transport support
Guido van Rossum9204af42013-11-30 15:35:42 -0800474 WriteTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700475 # The reason to accept file-like object instead of just file descriptor
476 # is: we need to own pipe and close it at transport finishing
477 # Can got complicated errors if pass f.fileno(),
478 # close fd in pipe transport then close f and vise versa.
479 raise NotImplementedError
480
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200481 async def subprocess_shell(self, protocol_factory, cmd, *,
482 stdin=subprocess.PIPE,
483 stdout=subprocess.PIPE,
484 stderr=subprocess.PIPE,
485 **kwargs):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700486 raise NotImplementedError
487
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200488 async def subprocess_exec(self, protocol_factory, *args,
489 stdin=subprocess.PIPE,
490 stdout=subprocess.PIPE,
491 stderr=subprocess.PIPE,
492 **kwargs):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700493 raise NotImplementedError
494
495 # Ready-based callback registration methods.
496 # The add_*() methods return None.
497 # The remove_*() methods return True if something was removed,
498 # False if there was nothing to delete.
499
500 def add_reader(self, fd, callback, *args):
501 raise NotImplementedError
502
503 def remove_reader(self, fd):
504 raise NotImplementedError
505
506 def add_writer(self, fd, callback, *args):
507 raise NotImplementedError
508
509 def remove_writer(self, fd):
510 raise NotImplementedError
511
512 # Completion based I/O methods returning Futures.
513
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200514 async def sock_recv(self, sock, nbytes):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700515 raise NotImplementedError
516
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200517 async def sock_recv_into(self, sock, buf):
Antoine Pitrou525f40d2017-10-19 21:46:40 +0200518 raise NotImplementedError
519
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200520 async def sock_sendall(self, sock, data):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700521 raise NotImplementedError
522
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200523 async def sock_connect(self, sock, address):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700524 raise NotImplementedError
525
Andrew Svetlov5f841b52017-12-09 00:23:48 +0200526 async def sock_accept(self, sock):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700527 raise NotImplementedError
528
Andrew Svetlov6b5a2792018-01-16 19:59:34 +0200529 async def sock_sendfile(self, sock, file, offset=0, count=None,
530 *, fallback=None):
531 raise NotImplementedError
532
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700533 # Signal handling.
534
535 def add_signal_handler(self, sig, callback, *args):
536 raise NotImplementedError
537
538 def remove_signal_handler(self, sig):
539 raise NotImplementedError
540
Yury Selivanov740169c2015-05-11 14:23:38 -0400541 # Task factory.
542
543 def set_task_factory(self, factory):
544 raise NotImplementedError
545
546 def get_task_factory(self):
547 raise NotImplementedError
548
Yury Selivanov569efa22014-02-18 18:02:19 -0500549 # Error handlers.
550
Yury Selivanov7ed7ce62016-05-16 15:20:38 -0400551 def get_exception_handler(self):
552 raise NotImplementedError
553
Yury Selivanov569efa22014-02-18 18:02:19 -0500554 def set_exception_handler(self, handler):
555 raise NotImplementedError
556
557 def default_exception_handler(self, context):
558 raise NotImplementedError
559
560 def call_exception_handler(self, context):
561 raise NotImplementedError
562
Victor Stinner0f3e6bc2014-02-19 23:15:02 +0100563 # Debug flag management.
564
565 def get_debug(self):
566 raise NotImplementedError
567
568 def set_debug(self, enabled):
569 raise NotImplementedError
570
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700571
572class AbstractEventLoopPolicy:
573 """Abstract policy for accessing the event loop."""
574
575 def get_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200576 """Get the event loop for the current context.
577
578 Returns an event loop object implementing the BaseEventLoop interface,
579 or raises an exception in case no event loop has been set for the
580 current context and the current policy does not specify to create one.
581
582 It should never return None."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700583 raise NotImplementedError
584
585 def set_event_loop(self, loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200586 """Set the event loop for the current context to loop."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700587 raise NotImplementedError
588
589 def new_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200590 """Create and return a new event loop object according to this
591 policy's rules. If there's need to set this loop as the event loop for
592 the current context, set_event_loop must be called explicitly."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700593 raise NotImplementedError
594
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800595 # Child processes handling (Unix only).
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700596
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800597 def get_child_watcher(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200598 "Get the watcher for child processes."
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800599 raise NotImplementedError
600
601 def set_child_watcher(self, watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200602 """Set the watcher for child processes."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800603 raise NotImplementedError
604
605
606class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700607 """Default policy implementation for accessing the event loop.
608
609 In this policy, each thread has its own event loop. However, we
610 only automatically create an event loop by default for the main
611 thread; other threads by default have no event loop.
612
613 Other policies may have different rules (e.g. a single global
614 event loop, or automatically creating an event loop per thread, or
615 using some other notion of context to which an event loop is
616 associated).
617 """
618
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800619 _loop_factory = None
620
621 class _Local(threading.local):
622 _loop = None
623 _set_called = False
624
625 def __init__(self):
626 self._local = self._Local()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700627
628 def get_event_loop(self):
629 """Get the event loop.
630
631 This may be None or an instance of EventLoop.
632 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800633 if (self._local._loop is None and
Yury Selivanov6370f342017-12-10 18:36:12 -0500634 not self._local._set_called and
635 isinstance(threading.current_thread(), threading._MainThread)):
Guido van Rossumcced0762013-11-27 10:37:13 -0800636 self.set_event_loop(self.new_event_loop())
Yury Selivanov6370f342017-12-10 18:36:12 -0500637
Victor Stinner3a1c7382014-12-18 01:20:10 +0100638 if self._local._loop is None:
639 raise RuntimeError('There is no current event loop in thread %r.'
640 % threading.current_thread().name)
Yury Selivanov6370f342017-12-10 18:36:12 -0500641
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800642 return self._local._loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700643
644 def set_event_loop(self, loop):
645 """Set the event loop."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800646 self._local._set_called = True
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700647 assert loop is None or isinstance(loop, AbstractEventLoop)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800648 self._local._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700649
650 def new_event_loop(self):
651 """Create a new event loop.
652
653 You must call set_event_loop() to make this the current event
654 loop.
655 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800656 return self._loop_factory()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700657
658
659# Event loop policy. The policy itself is always global, even if the
660# policy's rules say that there is an event loop per thread (or other
661# notion of context). The default policy is installed by the first
662# call to get_event_loop_policy().
663_event_loop_policy = None
664
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800665# Lock for protecting the on-the-fly creation of the event loop policy.
666_lock = threading.Lock()
667
668
Yury Selivanov600a3492016-11-04 14:29:28 -0400669# A TLS for the running event loop, used by _get_running_loop.
670class _RunningLoop(threading.local):
jimmylai80bbe6a72017-09-05 17:36:59 -0700671 loop_pid = (None, None)
Yury Selivanovba7e1f92017-03-02 20:07:11 -0500672
673
Yury Selivanov600a3492016-11-04 14:29:28 -0400674_running_loop = _RunningLoop()
675
676
Yury Selivanovabae67e2017-12-11 10:07:44 -0500677def get_running_loop():
678 """Return the running event loop. Raise a RuntimeError if there is none.
679
680 This function is thread-specific.
681 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500682 # NOTE: this function is implemented in C (see _asynciomodule.c)
Yury Selivanovabae67e2017-12-11 10:07:44 -0500683 loop = _get_running_loop()
684 if loop is None:
685 raise RuntimeError('no running event loop')
686 return loop
687
688
Yury Selivanov600a3492016-11-04 14:29:28 -0400689def _get_running_loop():
690 """Return the running event loop or None.
691
692 This is a low-level function intended to be used by event loops.
693 This function is thread-specific.
694 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500695 # NOTE: this function is implemented in C (see _asynciomodule.c)
jimmylai80bbe6a72017-09-05 17:36:59 -0700696 running_loop, pid = _running_loop.loop_pid
697 if running_loop is not None and pid == os.getpid():
Yury Selivanov902e9c52017-03-02 23:57:33 -0500698 return running_loop
Yury Selivanov600a3492016-11-04 14:29:28 -0400699
700
701def _set_running_loop(loop):
702 """Set the running event loop.
703
704 This is a low-level function intended to be used by event loops.
705 This function is thread-specific.
706 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500707 # NOTE: this function is implemented in C (see _asynciomodule.c)
jimmylai80bbe6a72017-09-05 17:36:59 -0700708 _running_loop.loop_pid = (loop, os.getpid())
Yury Selivanov600a3492016-11-04 14:29:28 -0400709
710
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800711def _init_event_loop_policy():
712 global _event_loop_policy
713 with _lock:
714 if _event_loop_policy is None: # pragma: no branch
715 from . import DefaultEventLoopPolicy
716 _event_loop_policy = DefaultEventLoopPolicy()
717
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700718
719def get_event_loop_policy():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200720 """Get the current event loop policy."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700721 if _event_loop_policy is None:
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800722 _init_event_loop_policy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700723 return _event_loop_policy
724
725
726def set_event_loop_policy(policy):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200727 """Set the current event loop policy.
728
729 If policy is None, the default policy is restored."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700730 global _event_loop_policy
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700731 assert policy is None or isinstance(policy, AbstractEventLoopPolicy)
732 _event_loop_policy = policy
733
734
735def get_event_loop():
Yury Selivanov600a3492016-11-04 14:29:28 -0400736 """Return an asyncio event loop.
737
738 When called from a coroutine or a callback (e.g. scheduled with call_soon
739 or similar API), this function will always return the running event loop.
740
741 If there is no running event loop set, the function will return
742 the result of `get_event_loop_policy().get_event_loop()` call.
743 """
Yury Selivanova70232f2017-12-13 14:49:42 -0500744 # NOTE: this function is implemented in C (see _asynciomodule.c)
Yury Selivanov600a3492016-11-04 14:29:28 -0400745 current_loop = _get_running_loop()
746 if current_loop is not None:
747 return current_loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700748 return get_event_loop_policy().get_event_loop()
749
750
751def set_event_loop(loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200752 """Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700753 get_event_loop_policy().set_event_loop(loop)
754
755
756def new_event_loop():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200757 """Equivalent to calling get_event_loop_policy().new_event_loop()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700758 return get_event_loop_policy().new_event_loop()
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800759
760
761def get_child_watcher():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200762 """Equivalent to calling get_event_loop_policy().get_child_watcher()."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800763 return get_event_loop_policy().get_child_watcher()
764
765
766def set_child_watcher(watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200767 """Equivalent to calling
768 get_event_loop_policy().set_child_watcher(watcher)."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800769 return get_event_loop_policy().set_child_watcher(watcher)
Yury Selivanova70232f2017-12-13 14:49:42 -0500770
771
772# Alias pure-Python implementations for testing purposes.
773_py__get_running_loop = _get_running_loop
774_py__set_running_loop = _set_running_loop
775_py_get_running_loop = get_running_loop
776_py_get_event_loop = get_event_loop
777
778
779try:
780 # get_event_loop() is one of the most frequently called
781 # functions in asyncio. Pure Python implementation is
782 # about 4 times slower than C-accelerated.
783 from _asyncio import (_get_running_loop, _set_running_loop,
784 get_running_loop, get_event_loop)
785except ImportError:
786 pass
787else:
788 # Alias C implementations for testing purposes.
789 _c__get_running_loop = _get_running_loop
790 _c__set_running_loop = _set_running_loop
791 _c_get_running_loop = get_running_loop
792 _c_get_event_loop = get_event_loop