blob: 6af91374ecfacee999c073976f6798a5e99962b3 [file] [log] [blame]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07001"""Event loop and event loop policy."""
2
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08003__all__ = ['AbstractEventLoopPolicy',
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07004 'AbstractEventLoop', 'AbstractServer',
5 'Handle', 'TimerHandle',
6 'get_event_loop_policy', 'set_event_loop_policy',
7 'get_event_loop', 'set_event_loop', 'new_event_loop',
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -08008 'get_child_watcher', 'set_child_watcher',
Yury Selivanov6ea2b8f2016-11-07 19:00:46 -05009 '_set_running_loop', '_get_running_loop',
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070010 ]
11
Victor Stinner307bccc2014-06-12 18:39:26 +020012import functools
13import inspect
Yury Selivanovba7e1f92017-03-02 20:07:11 -050014import os
Victor Stinner313a9802014-07-29 12:58:23 +020015import reprlib
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
20import traceback
Victor Stinner307bccc2014-06-12 18:39:26 +020021
Victor Stinner975735f2014-06-25 21:41:58 +020022
Victor Stinner307bccc2014-06-12 18:39:26 +020023def _get_function_source(func):
INADA Naoki3e2ad8e2017-04-25 10:57:18 +090024 func = inspect.unwrap(func)
Victor Stinner307bccc2014-06-12 18:39:26 +020025 if inspect.isfunction(func):
26 code = func.__code__
27 return (code.co_filename, code.co_firstlineno)
28 if isinstance(func, functools.partial):
29 return _get_function_source(func.func)
INADA Naoki3e2ad8e2017-04-25 10:57:18 +090030 if isinstance(func, functools.partialmethod):
Victor Stinner307bccc2014-06-12 18:39:26 +020031 return _get_function_source(func.func)
32 return None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070033
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070034
Yury Selivanov45dccda2016-09-15 15:58:15 -040035def _format_args_and_kwargs(args, kwargs):
36 """Format function arguments and keyword arguments.
Victor Stinner313a9802014-07-29 12:58:23 +020037
38 Special case for a single parameter: ('hello',) is formatted as ('hello').
39 """
40 # use reprlib to limit the length of the output
Yury Selivanov45dccda2016-09-15 15:58:15 -040041 items = []
42 if args:
43 items.extend(reprlib.repr(arg) for arg in args)
44 if kwargs:
45 items.extend('{}={}'.format(k, reprlib.repr(v))
46 for k, v in kwargs.items())
47 return '(' + ', '.join(items) + ')'
Victor Stinner975735f2014-06-25 21:41:58 +020048
49
Yury Selivanov45dccda2016-09-15 15:58:15 -040050def _format_callback(func, args, kwargs, suffix=''):
Victor Stinner975735f2014-06-25 21:41:58 +020051 if isinstance(func, functools.partial):
Yury Selivanov45dccda2016-09-15 15:58:15 -040052 suffix = _format_args_and_kwargs(args, kwargs) + suffix
53 return _format_callback(func.func, func.args, func.keywords, suffix)
Victor Stinner975735f2014-06-25 21:41:58 +020054
Guido van Rossum0a9933e2015-05-02 18:38:24 -070055 if hasattr(func, '__qualname__'):
56 func_repr = getattr(func, '__qualname__')
57 elif hasattr(func, '__name__'):
58 func_repr = getattr(func, '__name__')
59 else:
Victor Stinner975735f2014-06-25 21:41:58 +020060 func_repr = repr(func)
61
Yury Selivanov45dccda2016-09-15 15:58:15 -040062 func_repr += _format_args_and_kwargs(args, kwargs)
Victor Stinner975735f2014-06-25 21:41:58 +020063 if suffix:
64 func_repr += suffix
Guido van Rossum0a9933e2015-05-02 18:38:24 -070065 return func_repr
Victor Stinner975735f2014-06-25 21:41:58 +020066
Guido van Rossum0a9933e2015-05-02 18:38:24 -070067def _format_callback_source(func, args):
Yury Selivanov45dccda2016-09-15 15:58:15 -040068 func_repr = _format_callback(func, args, None)
Victor Stinner975735f2014-06-25 21:41:58 +020069 source = _get_function_source(func)
70 if source:
71 func_repr += ' at %s:%s' % source
72 return func_repr
73
74
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070075class Handle:
76 """Object returned by callback registration methods."""
77
Victor Stinner80f53aa2014-06-27 13:52:20 +020078 __slots__ = ('_callback', '_args', '_cancelled', '_loop',
Victor Stinner1b38bc62014-09-17 23:24:13 +020079 '_source_traceback', '_repr', '__weakref__')
Yury Selivanovb1317782014-02-12 17:01:52 -050080
Yury Selivanov569efa22014-02-18 18:02:19 -050081 def __init__(self, callback, args, loop):
Yury Selivanov569efa22014-02-18 18:02:19 -050082 self._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070083 self._callback = callback
84 self._args = args
85 self._cancelled = False
Victor Stinner1b38bc62014-09-17 23:24:13 +020086 self._repr = None
Victor Stinner80f53aa2014-06-27 13:52:20 +020087 if self._loop.get_debug():
88 self._source_traceback = traceback.extract_stack(sys._getframe(1))
89 else:
90 self._source_traceback = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070091
Victor Stinner1b38bc62014-09-17 23:24:13 +020092 def _repr_info(self):
Victor Stinnerf68bd882014-07-10 22:32:58 +020093 info = [self.__class__.__name__]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070094 if self._cancelled:
Victor Stinner975735f2014-06-25 21:41:58 +020095 info.append('cancelled')
Victor Stinnerf68bd882014-07-10 22:32:58 +020096 if self._callback is not None:
Guido van Rossum0a9933e2015-05-02 18:38:24 -070097 info.append(_format_callback_source(self._callback, self._args))
Victor Stinnerf68bd882014-07-10 22:32:58 +020098 if self._source_traceback:
99 frame = self._source_traceback[-1]
100 info.append('created at %s:%s' % (frame[0], frame[1]))
Victor Stinner1b38bc62014-09-17 23:24:13 +0200101 return info
102
103 def __repr__(self):
104 if self._repr is not None:
105 return self._repr
106 info = self._repr_info()
Victor Stinnerf68bd882014-07-10 22:32:58 +0200107 return '<%s>' % ' '.join(info)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700108
109 def cancel(self):
Yury Selivanov592ada92014-09-25 12:07:56 -0400110 if not self._cancelled:
111 self._cancelled = True
112 if self._loop.get_debug():
113 # Keep a representation in debug mode to keep callback and
114 # parameters. For example, to log the warning
115 # "Executing <Handle...> took 2.5 second"
116 self._repr = repr(self)
117 self._callback = None
118 self._args = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700119
120 def _run(self):
121 try:
122 self._callback(*self._args)
Yury Selivanov569efa22014-02-18 18:02:19 -0500123 except Exception as exc:
Guido van Rossum0a9933e2015-05-02 18:38:24 -0700124 cb = _format_callback_source(self._callback, self._args)
Victor Stinner17b53f12014-06-26 01:35:45 +0200125 msg = 'Exception in callback {}'.format(cb)
Victor Stinner80f53aa2014-06-27 13:52:20 +0200126 context = {
Yury Selivanov569efa22014-02-18 18:02:19 -0500127 'message': msg,
128 'exception': exc,
129 'handle': self,
Victor Stinner80f53aa2014-06-27 13:52:20 +0200130 }
131 if self._source_traceback:
132 context['source_traceback'] = self._source_traceback
133 self._loop.call_exception_handler(context)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700134 self = None # Needed to break cycles when an exception occurs.
135
136
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700137class TimerHandle(Handle):
138 """Object returned by timed callback registration methods."""
139
Yury Selivanov592ada92014-09-25 12:07:56 -0400140 __slots__ = ['_scheduled', '_when']
Yury Selivanovb1317782014-02-12 17:01:52 -0500141
Yury Selivanov569efa22014-02-18 18:02:19 -0500142 def __init__(self, when, callback, args, loop):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700143 assert when is not None
Yury Selivanov569efa22014-02-18 18:02:19 -0500144 super().__init__(callback, args, loop)
Victor Stinner80f53aa2014-06-27 13:52:20 +0200145 if self._source_traceback:
146 del self._source_traceback[-1]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700147 self._when = when
Yury Selivanov592ada92014-09-25 12:07:56 -0400148 self._scheduled = False
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700149
Victor Stinner1b38bc62014-09-17 23:24:13 +0200150 def _repr_info(self):
151 info = super()._repr_info()
152 pos = 2 if self._cancelled else 1
153 info.insert(pos, 'when=%s' % self._when)
154 return info
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700155
156 def __hash__(self):
157 return hash(self._when)
158
159 def __lt__(self, other):
160 return self._when < other._when
161
162 def __le__(self, other):
163 if self._when < other._when:
164 return True
165 return self.__eq__(other)
166
167 def __gt__(self, other):
168 return self._when > other._when
169
170 def __ge__(self, other):
171 if self._when > other._when:
172 return True
173 return self.__eq__(other)
174
175 def __eq__(self, other):
176 if isinstance(other, TimerHandle):
177 return (self._when == other._when and
178 self._callback == other._callback and
179 self._args == other._args and
180 self._cancelled == other._cancelled)
181 return NotImplemented
182
183 def __ne__(self, other):
184 equal = self.__eq__(other)
185 return NotImplemented if equal is NotImplemented else not equal
186
Yury Selivanov592ada92014-09-25 12:07:56 -0400187 def cancel(self):
188 if not self._cancelled:
189 self._loop._timer_handle_cancelled(self)
190 super().cancel()
191
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700192
193class AbstractServer:
Victor Stinnercf6f72e2013-12-03 18:23:52 +0100194 """Abstract server returned by create_server()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700195
196 def close(self):
197 """Stop serving. This leaves existing connections open."""
198 return NotImplemented
199
200 def wait_closed(self):
201 """Coroutine to wait until service is closed."""
202 return NotImplemented
203
204
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
Yury Selivanovf6d991d2016-09-15 13:10:51 -0400248 def shutdown_asyncgens(self):
249 """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
275 def create_task(self, coro):
276 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
Yury Selivanov740169c2015-05-11 14:23:38 -0400283 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
291 def getaddrinfo(self, host, port, *, family=0, type=0, proto=0, flags=0):
292 raise NotImplementedError
293
294 def getnameinfo(self, sockaddr, flags=0):
295 raise NotImplementedError
296
297 def create_connection(self, protocol_factory, host=None, port=None, *,
298 ssl=None, family=0, proto=0, flags=0, sock=None,
Guido van Rossum21c85a72013-11-01 14:16:54 -0700299 local_addr=None, server_hostname=None):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700300 raise NotImplementedError
301
302 def create_server(self, protocol_factory, host=None, port=None, *,
303 family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE,
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700304 sock=None, backlog=100, ssl=None, reuse_address=None,
305 reuse_port=None):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700306 """A coroutine which creates a TCP server bound to host and port.
307
308 The return value is a Server object which can be used to stop
309 the service.
310
311 If host is an empty string or None all interfaces are assumed
312 and a list of multiple sockets will be returned (most likely
Victor Stinner5e4a7d82015-09-21 18:33:43 +0200313 one for IPv4 and another one for IPv6). The host parameter can also be a
314 sequence (e.g. list) of hosts to bind to.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700315
316 family can be set to either AF_INET or AF_INET6 to force the
317 socket to use IPv4 or IPv6. If not set it will be determined
318 from host (defaults to AF_UNSPEC).
319
320 flags is a bitmask for getaddrinfo().
321
322 sock can optionally be specified in order to use a preexisting
323 socket object.
324
325 backlog is the maximum number of queued connections passed to
326 listen() (defaults to 100).
327
328 ssl can be set to an SSLContext to enable SSL over the
329 accepted connections.
330
331 reuse_address tells the kernel to reuse a local socket in
332 TIME_WAIT state, without waiting for its natural timeout to
333 expire. If not specified will automatically be set to True on
334 UNIX.
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700335
336 reuse_port tells the kernel to allow this endpoint to be bound to
337 the same port as other existing endpoints are bound to, so long as
338 they all set this flag when being created. This option is not
339 supported on Windows.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700340 """
341 raise NotImplementedError
342
Yury Selivanovb057c522014-02-18 12:15:06 -0500343 def create_unix_connection(self, protocol_factory, path, *,
344 ssl=None, sock=None,
345 server_hostname=None):
346 raise NotImplementedError
347
348 def create_unix_server(self, protocol_factory, path, *,
349 sock=None, backlog=100, ssl=None):
350 """A coroutine which creates a UNIX Domain Socket server.
351
Yury Selivanovdec1a452014-02-18 22:27:48 -0500352 The return value is a Server object, which can be used to stop
Yury Selivanovb057c522014-02-18 12:15:06 -0500353 the service.
354
355 path is a str, representing a file systsem path to bind the
356 server socket to.
357
358 sock can optionally be specified in order to use a preexisting
359 socket object.
360
361 backlog is the maximum number of queued connections passed to
362 listen() (defaults to 100).
363
364 ssl can be set to an SSLContext to enable SSL over the
365 accepted connections.
366 """
367 raise NotImplementedError
368
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700369 def create_datagram_endpoint(self, protocol_factory,
370 local_addr=None, remote_addr=None, *,
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700371 family=0, proto=0, flags=0,
372 reuse_address=None, reuse_port=None,
373 allow_broadcast=None, sock=None):
374 """A coroutine which creates a datagram endpoint.
375
376 This method will try to establish the endpoint in the background.
377 When successful, the coroutine returns a (transport, protocol) pair.
378
379 protocol_factory must be a callable returning a protocol instance.
380
381 socket family AF_INET or socket.AF_INET6 depending on host (or
382 family if specified), socket type SOCK_DGRAM.
383
384 reuse_address tells the kernel to reuse a local socket in
385 TIME_WAIT state, without waiting for its natural timeout to
386 expire. If not specified it will automatically be set to True on
387 UNIX.
388
389 reuse_port tells the kernel to allow this endpoint to be bound to
390 the same port as other existing endpoints are bound to, so long as
391 they all set this flag when being created. This option is not
392 supported on Windows and some UNIX's. If the
393 :py:data:`~socket.SO_REUSEPORT` constant is not defined then this
394 capability is unsupported.
395
396 allow_broadcast tells the kernel to allow this endpoint to send
397 messages to the broadcast address.
398
399 sock can optionally be specified in order to use a preexisting
400 socket object.
401 """
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700402 raise NotImplementedError
403
Guido van Rossume3f52ef2013-11-01 14:19:04 -0700404 # Pipes and subprocesses.
405
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700406 def connect_read_pipe(self, protocol_factory, pipe):
Victor Stinnera5b257a2014-05-29 00:14:03 +0200407 """Register read pipe in event loop. Set the pipe to non-blocking mode.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700408
409 protocol_factory should instantiate object with Protocol interface.
Victor Stinnera5b257a2014-05-29 00:14:03 +0200410 pipe is a file-like object.
411 Return pair (transport, protocol), where transport supports the
Guido van Rossum9204af42013-11-30 15:35:42 -0800412 ReadTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700413 # The reason to accept file-like object instead of just file descriptor
414 # is: we need to own pipe and close it at transport finishing
415 # Can got complicated errors if pass f.fileno(),
416 # close fd in pipe transport then close f and vise versa.
417 raise NotImplementedError
418
419 def connect_write_pipe(self, protocol_factory, pipe):
Yury Selivanovdec1a452014-02-18 22:27:48 -0500420 """Register write pipe in event loop.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700421
422 protocol_factory should instantiate object with BaseProtocol interface.
423 Pipe is file-like object already switched to nonblocking.
424 Return pair (transport, protocol), where transport support
Guido van Rossum9204af42013-11-30 15:35:42 -0800425 WriteTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700426 # The reason to accept file-like object instead of just file descriptor
427 # is: we need to own pipe and close it at transport finishing
428 # Can got complicated errors if pass f.fileno(),
429 # close fd in pipe transport then close f and vise versa.
430 raise NotImplementedError
431
432 def subprocess_shell(self, protocol_factory, cmd, *, stdin=subprocess.PIPE,
433 stdout=subprocess.PIPE, stderr=subprocess.PIPE,
434 **kwargs):
435 raise NotImplementedError
436
437 def subprocess_exec(self, protocol_factory, *args, stdin=subprocess.PIPE,
438 stdout=subprocess.PIPE, stderr=subprocess.PIPE,
439 **kwargs):
440 raise NotImplementedError
441
442 # Ready-based callback registration methods.
443 # The add_*() methods return None.
444 # The remove_*() methods return True if something was removed,
445 # False if there was nothing to delete.
446
447 def add_reader(self, fd, callback, *args):
448 raise NotImplementedError
449
450 def remove_reader(self, fd):
451 raise NotImplementedError
452
453 def add_writer(self, fd, callback, *args):
454 raise NotImplementedError
455
456 def remove_writer(self, fd):
457 raise NotImplementedError
458
459 # Completion based I/O methods returning Futures.
460
461 def sock_recv(self, sock, nbytes):
462 raise NotImplementedError
463
464 def sock_sendall(self, sock, data):
465 raise NotImplementedError
466
467 def sock_connect(self, sock, address):
468 raise NotImplementedError
469
470 def sock_accept(self, sock):
471 raise NotImplementedError
472
473 # Signal handling.
474
475 def add_signal_handler(self, sig, callback, *args):
476 raise NotImplementedError
477
478 def remove_signal_handler(self, sig):
479 raise NotImplementedError
480
Yury Selivanov740169c2015-05-11 14:23:38 -0400481 # Task factory.
482
483 def set_task_factory(self, factory):
484 raise NotImplementedError
485
486 def get_task_factory(self):
487 raise NotImplementedError
488
Yury Selivanov569efa22014-02-18 18:02:19 -0500489 # Error handlers.
490
Yury Selivanov7ed7ce62016-05-16 15:20:38 -0400491 def get_exception_handler(self):
492 raise NotImplementedError
493
Yury Selivanov569efa22014-02-18 18:02:19 -0500494 def set_exception_handler(self, handler):
495 raise NotImplementedError
496
497 def default_exception_handler(self, context):
498 raise NotImplementedError
499
500 def call_exception_handler(self, context):
501 raise NotImplementedError
502
Victor Stinner0f3e6bc2014-02-19 23:15:02 +0100503 # Debug flag management.
504
505 def get_debug(self):
506 raise NotImplementedError
507
508 def set_debug(self, enabled):
509 raise NotImplementedError
510
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700511
512class AbstractEventLoopPolicy:
513 """Abstract policy for accessing the event loop."""
514
515 def get_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200516 """Get the event loop for the current context.
517
518 Returns an event loop object implementing the BaseEventLoop interface,
519 or raises an exception in case no event loop has been set for the
520 current context and the current policy does not specify to create one.
521
522 It should never return None."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700523 raise NotImplementedError
524
525 def set_event_loop(self, loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200526 """Set the event loop for the current context to loop."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700527 raise NotImplementedError
528
529 def new_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200530 """Create and return a new event loop object according to this
531 policy's rules. If there's need to set this loop as the event loop for
532 the current context, set_event_loop must be called explicitly."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700533 raise NotImplementedError
534
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800535 # Child processes handling (Unix only).
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700536
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800537 def get_child_watcher(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200538 "Get the watcher for child processes."
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800539 raise NotImplementedError
540
541 def set_child_watcher(self, watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200542 """Set the watcher for child processes."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800543 raise NotImplementedError
544
545
546class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700547 """Default policy implementation for accessing the event loop.
548
549 In this policy, each thread has its own event loop. However, we
550 only automatically create an event loop by default for the main
551 thread; other threads by default have no event loop.
552
553 Other policies may have different rules (e.g. a single global
554 event loop, or automatically creating an event loop per thread, or
555 using some other notion of context to which an event loop is
556 associated).
557 """
558
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800559 _loop_factory = None
560
561 class _Local(threading.local):
562 _loop = None
563 _set_called = False
564
565 def __init__(self):
566 self._local = self._Local()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700567
568 def get_event_loop(self):
569 """Get the event loop.
570
571 This may be None or an instance of EventLoop.
572 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800573 if (self._local._loop is None and
574 not self._local._set_called and
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700575 isinstance(threading.current_thread(), threading._MainThread)):
Guido van Rossumcced0762013-11-27 10:37:13 -0800576 self.set_event_loop(self.new_event_loop())
Victor Stinner3a1c7382014-12-18 01:20:10 +0100577 if self._local._loop is None:
578 raise RuntimeError('There is no current event loop in thread %r.'
579 % threading.current_thread().name)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800580 return self._local._loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700581
582 def set_event_loop(self, loop):
583 """Set the event loop."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800584 self._local._set_called = True
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700585 assert loop is None or isinstance(loop, AbstractEventLoop)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800586 self._local._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700587
588 def new_event_loop(self):
589 """Create a new event loop.
590
591 You must call set_event_loop() to make this the current event
592 loop.
593 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800594 return self._loop_factory()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700595
596
597# Event loop policy. The policy itself is always global, even if the
598# policy's rules say that there is an event loop per thread (or other
599# notion of context). The default policy is installed by the first
600# call to get_event_loop_policy().
601_event_loop_policy = None
602
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800603# Lock for protecting the on-the-fly creation of the event loop policy.
604_lock = threading.Lock()
605
606
Yury Selivanov600a3492016-11-04 14:29:28 -0400607# A TLS for the running event loop, used by _get_running_loop.
608class _RunningLoop(threading.local):
609 _loop = None
Yury Selivanovba7e1f92017-03-02 20:07:11 -0500610 _pid = None
611
612
Yury Selivanov600a3492016-11-04 14:29:28 -0400613_running_loop = _RunningLoop()
614
615
616def _get_running_loop():
617 """Return the running event loop or None.
618
619 This is a low-level function intended to be used by event loops.
620 This function is thread-specific.
621 """
Yury Selivanov902e9c52017-03-02 23:57:33 -0500622 running_loop = _running_loop._loop
623 if running_loop is not None and _running_loop._pid == os.getpid():
624 return running_loop
Yury Selivanov600a3492016-11-04 14:29:28 -0400625
626
627def _set_running_loop(loop):
628 """Set the running event loop.
629
630 This is a low-level function intended to be used by event loops.
631 This function is thread-specific.
632 """
Yury Selivanovba7e1f92017-03-02 20:07:11 -0500633 _running_loop._pid = os.getpid()
Yury Selivanov600a3492016-11-04 14:29:28 -0400634 _running_loop._loop = loop
635
636
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800637def _init_event_loop_policy():
638 global _event_loop_policy
639 with _lock:
640 if _event_loop_policy is None: # pragma: no branch
641 from . import DefaultEventLoopPolicy
642 _event_loop_policy = DefaultEventLoopPolicy()
643
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700644
645def get_event_loop_policy():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200646 """Get the current event loop policy."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700647 if _event_loop_policy is None:
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800648 _init_event_loop_policy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700649 return _event_loop_policy
650
651
652def set_event_loop_policy(policy):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200653 """Set the current event loop policy.
654
655 If policy is None, the default policy is restored."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700656 global _event_loop_policy
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700657 assert policy is None or isinstance(policy, AbstractEventLoopPolicy)
658 _event_loop_policy = policy
659
660
661def get_event_loop():
Yury Selivanov600a3492016-11-04 14:29:28 -0400662 """Return an asyncio event loop.
663
664 When called from a coroutine or a callback (e.g. scheduled with call_soon
665 or similar API), this function will always return the running event loop.
666
667 If there is no running event loop set, the function will return
668 the result of `get_event_loop_policy().get_event_loop()` call.
669 """
670 current_loop = _get_running_loop()
671 if current_loop is not None:
672 return current_loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700673 return get_event_loop_policy().get_event_loop()
674
675
676def set_event_loop(loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200677 """Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700678 get_event_loop_policy().set_event_loop(loop)
679
680
681def new_event_loop():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200682 """Equivalent to calling get_event_loop_policy().new_event_loop()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700683 return get_event_loop_policy().new_event_loop()
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800684
685
686def get_child_watcher():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200687 """Equivalent to calling get_event_loop_policy().get_child_watcher()."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800688 return get_event_loop_policy().get_child_watcher()
689
690
691def set_child_watcher(watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200692 """Equivalent to calling
693 get_event_loop_policy().set_child_watcher(watcher)."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800694 return get_event_loop_policy().set_child_watcher(watcher)