blob: c48c5bed736026301cd64e26a88c3b178ac0a491 [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',
Guido van Rossum27b7c7e2013-10-17 13:40:50 -07009 ]
10
Victor Stinner307bccc2014-06-12 18:39:26 +020011import functools
12import inspect
Victor Stinner313a9802014-07-29 12:58:23 +020013import reprlib
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070014import socket
Victor Stinner313a9802014-07-29 12:58:23 +020015import subprocess
Victor Stinner307bccc2014-06-12 18:39:26 +020016import sys
Victor Stinner313a9802014-07-29 12:58:23 +020017import threading
18import traceback
Victor Stinner307bccc2014-06-12 18:39:26 +020019
Victor Stinner71080fc2015-07-25 02:23:21 +020020from asyncio import compat
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):
Victor Stinner71080fc2015-07-25 02:23:21 +020024 if compat.PY34:
Victor Stinner307bccc2014-06-12 18:39:26 +020025 func = inspect.unwrap(func)
26 elif hasattr(func, '__wrapped__'):
27 func = func.__wrapped__
28 if inspect.isfunction(func):
29 code = func.__code__
30 return (code.co_filename, code.co_firstlineno)
31 if isinstance(func, functools.partial):
32 return _get_function_source(func.func)
Victor Stinner71080fc2015-07-25 02:23:21 +020033 if compat.PY34 and isinstance(func, functools.partialmethod):
Victor Stinner307bccc2014-06-12 18:39:26 +020034 return _get_function_source(func.func)
35 return None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070036
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070037
Victor Stinner975735f2014-06-25 21:41:58 +020038def _format_args(args):
Victor Stinner313a9802014-07-29 12:58:23 +020039 """Format function arguments.
40
41 Special case for a single parameter: ('hello',) is formatted as ('hello').
42 """
43 # use reprlib to limit the length of the output
44 args_repr = reprlib.repr(args)
Victor Stinner975735f2014-06-25 21:41:58 +020045 if len(args) == 1 and args_repr.endswith(',)'):
46 args_repr = args_repr[:-2] + ')'
47 return args_repr
48
49
50def _format_callback(func, args, suffix=''):
51 if isinstance(func, functools.partial):
52 if args is not None:
53 suffix = _format_args(args) + suffix
54 return _format_callback(func.func, func.args, suffix)
55
Guido van Rossum0a9933e2015-05-02 18:38:24 -070056 if hasattr(func, '__qualname__'):
57 func_repr = getattr(func, '__qualname__')
58 elif hasattr(func, '__name__'):
59 func_repr = getattr(func, '__name__')
60 else:
Victor Stinner975735f2014-06-25 21:41:58 +020061 func_repr = repr(func)
62
63 if args is not None:
64 func_repr += _format_args(args)
65 if suffix:
66 func_repr += suffix
Guido van Rossum0a9933e2015-05-02 18:38:24 -070067 return func_repr
Victor Stinner975735f2014-06-25 21:41:58 +020068
Guido van Rossum0a9933e2015-05-02 18:38:24 -070069def _format_callback_source(func, args):
70 func_repr = _format_callback(func, args)
Victor Stinner975735f2014-06-25 21:41:58 +020071 source = _get_function_source(func)
72 if source:
73 func_repr += ' at %s:%s' % source
74 return func_repr
75
76
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070077class Handle:
78 """Object returned by callback registration methods."""
79
Victor Stinner80f53aa2014-06-27 13:52:20 +020080 __slots__ = ('_callback', '_args', '_cancelled', '_loop',
Victor Stinner1b38bc62014-09-17 23:24:13 +020081 '_source_traceback', '_repr', '__weakref__')
Yury Selivanovb1317782014-02-12 17:01:52 -050082
Yury Selivanov569efa22014-02-18 18:02:19 -050083 def __init__(self, callback, args, loop):
Victor Stinnerdc62b7e2014-02-10 00:45:44 +010084 assert not isinstance(callback, Handle), 'A Handle is not a callback'
Yury Selivanov569efa22014-02-18 18:02:19 -050085 self._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070086 self._callback = callback
87 self._args = args
88 self._cancelled = False
Victor Stinner1b38bc62014-09-17 23:24:13 +020089 self._repr = None
Victor Stinner80f53aa2014-06-27 13:52:20 +020090 if self._loop.get_debug():
91 self._source_traceback = traceback.extract_stack(sys._getframe(1))
92 else:
93 self._source_traceback = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070094
Victor Stinner1b38bc62014-09-17 23:24:13 +020095 def _repr_info(self):
Victor Stinnerf68bd882014-07-10 22:32:58 +020096 info = [self.__class__.__name__]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -070097 if self._cancelled:
Victor Stinner975735f2014-06-25 21:41:58 +020098 info.append('cancelled')
Victor Stinnerf68bd882014-07-10 22:32:58 +020099 if self._callback is not None:
Guido van Rossum0a9933e2015-05-02 18:38:24 -0700100 info.append(_format_callback_source(self._callback, self._args))
Victor Stinnerf68bd882014-07-10 22:32:58 +0200101 if self._source_traceback:
102 frame = self._source_traceback[-1]
103 info.append('created at %s:%s' % (frame[0], frame[1]))
Victor Stinner1b38bc62014-09-17 23:24:13 +0200104 return info
105
106 def __repr__(self):
107 if self._repr is not None:
108 return self._repr
109 info = self._repr_info()
Victor Stinnerf68bd882014-07-10 22:32:58 +0200110 return '<%s>' % ' '.join(info)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700111
112 def cancel(self):
Yury Selivanov592ada92014-09-25 12:07:56 -0400113 if not self._cancelled:
114 self._cancelled = True
115 if self._loop.get_debug():
116 # Keep a representation in debug mode to keep callback and
117 # parameters. For example, to log the warning
118 # "Executing <Handle...> took 2.5 second"
119 self._repr = repr(self)
120 self._callback = None
121 self._args = None
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700122
123 def _run(self):
124 try:
125 self._callback(*self._args)
Yury Selivanov569efa22014-02-18 18:02:19 -0500126 except Exception as exc:
Guido van Rossum0a9933e2015-05-02 18:38:24 -0700127 cb = _format_callback_source(self._callback, self._args)
Victor Stinner17b53f12014-06-26 01:35:45 +0200128 msg = 'Exception in callback {}'.format(cb)
Victor Stinner80f53aa2014-06-27 13:52:20 +0200129 context = {
Yury Selivanov569efa22014-02-18 18:02:19 -0500130 'message': msg,
131 'exception': exc,
132 'handle': self,
Victor Stinner80f53aa2014-06-27 13:52:20 +0200133 }
134 if self._source_traceback:
135 context['source_traceback'] = self._source_traceback
136 self._loop.call_exception_handler(context)
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700137 self = None # Needed to break cycles when an exception occurs.
138
139
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700140class TimerHandle(Handle):
141 """Object returned by timed callback registration methods."""
142
Yury Selivanov592ada92014-09-25 12:07:56 -0400143 __slots__ = ['_scheduled', '_when']
Yury Selivanovb1317782014-02-12 17:01:52 -0500144
Yury Selivanov569efa22014-02-18 18:02:19 -0500145 def __init__(self, when, callback, args, loop):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700146 assert when is not None
Yury Selivanov569efa22014-02-18 18:02:19 -0500147 super().__init__(callback, args, loop)
Victor Stinner80f53aa2014-06-27 13:52:20 +0200148 if self._source_traceback:
149 del self._source_traceback[-1]
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700150 self._when = when
Yury Selivanov592ada92014-09-25 12:07:56 -0400151 self._scheduled = False
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700152
Victor Stinner1b38bc62014-09-17 23:24:13 +0200153 def _repr_info(self):
154 info = super()._repr_info()
155 pos = 2 if self._cancelled else 1
156 info.insert(pos, 'when=%s' % self._when)
157 return info
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700158
159 def __hash__(self):
160 return hash(self._when)
161
162 def __lt__(self, other):
163 return self._when < other._when
164
165 def __le__(self, other):
166 if self._when < other._when:
167 return True
168 return self.__eq__(other)
169
170 def __gt__(self, other):
171 return self._when > other._when
172
173 def __ge__(self, other):
174 if self._when > other._when:
175 return True
176 return self.__eq__(other)
177
178 def __eq__(self, other):
179 if isinstance(other, TimerHandle):
180 return (self._when == other._when and
181 self._callback == other._callback and
182 self._args == other._args and
183 self._cancelled == other._cancelled)
184 return NotImplemented
185
186 def __ne__(self, other):
187 equal = self.__eq__(other)
188 return NotImplemented if equal is NotImplemented else not equal
189
Yury Selivanov592ada92014-09-25 12:07:56 -0400190 def cancel(self):
191 if not self._cancelled:
192 self._loop._timer_handle_cancelled(self)
193 super().cancel()
194
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700195
196class AbstractServer:
Victor Stinnercf6f72e2013-12-03 18:23:52 +0100197 """Abstract server returned by create_server()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700198
199 def close(self):
200 """Stop serving. This leaves existing connections open."""
201 return NotImplemented
202
203 def wait_closed(self):
204 """Coroutine to wait until service is closed."""
205 return NotImplemented
206
207
208class AbstractEventLoop:
209 """Abstract event loop."""
210
211 # Running and stopping the event loop.
212
213 def run_forever(self):
214 """Run the event loop until stop() is called."""
215 raise NotImplementedError
216
217 def run_until_complete(self, future):
218 """Run the event loop until a Future is done.
219
220 Return the Future's result, or raise its exception.
221 """
222 raise NotImplementedError
223
224 def stop(self):
225 """Stop the event loop as soon as reasonable.
226
227 Exactly how soon that is may depend on the implementation, but
228 no more I/O callbacks should be scheduled.
229 """
230 raise NotImplementedError
231
232 def is_running(self):
233 """Return whether the event loop is currently running."""
234 raise NotImplementedError
235
Victor Stinner896a25a2014-07-08 11:29:25 +0200236 def is_closed(self):
237 """Returns True if the event loop was closed."""
238 raise NotImplementedError
239
Guido van Rossume3f52ef2013-11-01 14:19:04 -0700240 def close(self):
241 """Close the loop.
242
243 The loop should not be running.
244
245 This is idempotent and irreversible.
246
247 No other methods should be called after this one.
248 """
249 raise NotImplementedError
250
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700251 # Methods scheduling callbacks. All these return Handles.
252
Yury Selivanov592ada92014-09-25 12:07:56 -0400253 def _timer_handle_cancelled(self, handle):
254 """Notification that a TimerHandle has been cancelled."""
255 raise NotImplementedError
256
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700257 def call_soon(self, callback, *args):
258 return self.call_later(0, callback, *args)
259
260 def call_later(self, delay, callback, *args):
261 raise NotImplementedError
262
263 def call_at(self, when, callback, *args):
264 raise NotImplementedError
265
266 def time(self):
267 raise NotImplementedError
268
Yury Selivanov7661db62016-05-16 15:38:39 -0400269 def create_future(self):
270 raise NotImplementedError
271
Victor Stinner896a25a2014-07-08 11:29:25 +0200272 # Method scheduling a coroutine object: create a task.
273
274 def create_task(self, coro):
275 raise NotImplementedError
276
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700277 # Methods for interacting with threads.
278
279 def call_soon_threadsafe(self, callback, *args):
280 raise NotImplementedError
281
Yury Selivanov740169c2015-05-11 14:23:38 -0400282 def run_in_executor(self, executor, func, *args):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700283 raise NotImplementedError
284
285 def set_default_executor(self, executor):
286 raise NotImplementedError
287
288 # Network I/O methods returning Futures.
289
290 def getaddrinfo(self, host, port, *, family=0, type=0, proto=0, flags=0):
291 raise NotImplementedError
292
293 def getnameinfo(self, sockaddr, flags=0):
294 raise NotImplementedError
295
296 def create_connection(self, protocol_factory, host=None, port=None, *,
297 ssl=None, family=0, proto=0, flags=0, sock=None,
Guido van Rossum21c85a72013-11-01 14:16:54 -0700298 local_addr=None, server_hostname=None):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700299 raise NotImplementedError
300
301 def create_server(self, protocol_factory, host=None, port=None, *,
302 family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE,
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700303 sock=None, backlog=100, ssl=None, reuse_address=None,
304 reuse_port=None):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700305 """A coroutine which creates a TCP server bound to host and port.
306
307 The return value is a Server object which can be used to stop
308 the service.
309
310 If host is an empty string or None all interfaces are assumed
311 and a list of multiple sockets will be returned (most likely
Victor Stinner5e4a7d82015-09-21 18:33:43 +0200312 one for IPv4 and another one for IPv6). The host parameter can also be a
313 sequence (e.g. list) of hosts to bind to.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700314
315 family can be set to either AF_INET or AF_INET6 to force the
316 socket to use IPv4 or IPv6. If not set it will be determined
317 from host (defaults to AF_UNSPEC).
318
319 flags is a bitmask for getaddrinfo().
320
321 sock can optionally be specified in order to use a preexisting
322 socket object.
323
324 backlog is the maximum number of queued connections passed to
325 listen() (defaults to 100).
326
327 ssl can be set to an SSLContext to enable SSL over the
328 accepted connections.
329
330 reuse_address tells the kernel to reuse a local socket in
331 TIME_WAIT state, without waiting for its natural timeout to
332 expire. If not specified will automatically be set to True on
333 UNIX.
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700334
335 reuse_port tells the kernel to allow this endpoint to be bound to
336 the same port as other existing endpoints are bound to, so long as
337 they all set this flag when being created. This option is not
338 supported on Windows.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700339 """
340 raise NotImplementedError
341
Yury Selivanovb057c522014-02-18 12:15:06 -0500342 def create_unix_connection(self, protocol_factory, path, *,
343 ssl=None, sock=None,
344 server_hostname=None):
345 raise NotImplementedError
346
347 def create_unix_server(self, protocol_factory, path, *,
348 sock=None, backlog=100, ssl=None):
349 """A coroutine which creates a UNIX Domain Socket server.
350
Yury Selivanovdec1a452014-02-18 22:27:48 -0500351 The return value is a Server object, which can be used to stop
Yury Selivanovb057c522014-02-18 12:15:06 -0500352 the service.
353
354 path is a str, representing a file systsem path to bind the
355 server socket to.
356
357 sock can optionally be specified in order to use a preexisting
358 socket object.
359
360 backlog is the maximum number of queued connections passed to
361 listen() (defaults to 100).
362
363 ssl can be set to an SSLContext to enable SSL over the
364 accepted connections.
365 """
366 raise NotImplementedError
367
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700368 def create_datagram_endpoint(self, protocol_factory,
369 local_addr=None, remote_addr=None, *,
Guido van Rossumb9bf9132015-10-05 09:15:28 -0700370 family=0, proto=0, flags=0,
371 reuse_address=None, reuse_port=None,
372 allow_broadcast=None, sock=None):
373 """A coroutine which creates a datagram endpoint.
374
375 This method will try to establish the endpoint in the background.
376 When successful, the coroutine returns a (transport, protocol) pair.
377
378 protocol_factory must be a callable returning a protocol instance.
379
380 socket family AF_INET or socket.AF_INET6 depending on host (or
381 family if specified), socket type SOCK_DGRAM.
382
383 reuse_address tells the kernel to reuse a local socket in
384 TIME_WAIT state, without waiting for its natural timeout to
385 expire. If not specified it will automatically be set to True on
386 UNIX.
387
388 reuse_port tells the kernel to allow this endpoint to be bound to
389 the same port as other existing endpoints are bound to, so long as
390 they all set this flag when being created. This option is not
391 supported on Windows and some UNIX's. If the
392 :py:data:`~socket.SO_REUSEPORT` constant is not defined then this
393 capability is unsupported.
394
395 allow_broadcast tells the kernel to allow this endpoint to send
396 messages to the broadcast address.
397
398 sock can optionally be specified in order to use a preexisting
399 socket object.
400 """
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700401 raise NotImplementedError
402
Guido van Rossume3f52ef2013-11-01 14:19:04 -0700403 # Pipes and subprocesses.
404
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700405 def connect_read_pipe(self, protocol_factory, pipe):
Victor Stinnera5b257a2014-05-29 00:14:03 +0200406 """Register read pipe in event loop. Set the pipe to non-blocking mode.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700407
408 protocol_factory should instantiate object with Protocol interface.
Victor Stinnera5b257a2014-05-29 00:14:03 +0200409 pipe is a file-like object.
410 Return pair (transport, protocol), where transport supports the
Guido van Rossum9204af42013-11-30 15:35:42 -0800411 ReadTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700412 # The reason to accept file-like object instead of just file descriptor
413 # is: we need to own pipe and close it at transport finishing
414 # Can got complicated errors if pass f.fileno(),
415 # close fd in pipe transport then close f and vise versa.
416 raise NotImplementedError
417
418 def connect_write_pipe(self, protocol_factory, pipe):
Yury Selivanovdec1a452014-02-18 22:27:48 -0500419 """Register write pipe in event loop.
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700420
421 protocol_factory should instantiate object with BaseProtocol interface.
422 Pipe is file-like object already switched to nonblocking.
423 Return pair (transport, protocol), where transport support
Guido van Rossum9204af42013-11-30 15:35:42 -0800424 WriteTransport interface."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700425 # The reason to accept file-like object instead of just file descriptor
426 # is: we need to own pipe and close it at transport finishing
427 # Can got complicated errors if pass f.fileno(),
428 # close fd in pipe transport then close f and vise versa.
429 raise NotImplementedError
430
431 def subprocess_shell(self, protocol_factory, cmd, *, stdin=subprocess.PIPE,
432 stdout=subprocess.PIPE, stderr=subprocess.PIPE,
433 **kwargs):
434 raise NotImplementedError
435
436 def subprocess_exec(self, protocol_factory, *args, stdin=subprocess.PIPE,
437 stdout=subprocess.PIPE, stderr=subprocess.PIPE,
438 **kwargs):
439 raise NotImplementedError
440
441 # Ready-based callback registration methods.
442 # The add_*() methods return None.
443 # The remove_*() methods return True if something was removed,
444 # False if there was nothing to delete.
445
446 def add_reader(self, fd, callback, *args):
447 raise NotImplementedError
448
449 def remove_reader(self, fd):
450 raise NotImplementedError
451
452 def add_writer(self, fd, callback, *args):
453 raise NotImplementedError
454
455 def remove_writer(self, fd):
456 raise NotImplementedError
457
458 # Completion based I/O methods returning Futures.
459
460 def sock_recv(self, sock, nbytes):
461 raise NotImplementedError
462
463 def sock_sendall(self, sock, data):
464 raise NotImplementedError
465
466 def sock_connect(self, sock, address):
467 raise NotImplementedError
468
469 def sock_accept(self, sock):
470 raise NotImplementedError
471
472 # Signal handling.
473
474 def add_signal_handler(self, sig, callback, *args):
475 raise NotImplementedError
476
477 def remove_signal_handler(self, sig):
478 raise NotImplementedError
479
Yury Selivanov740169c2015-05-11 14:23:38 -0400480 # Task factory.
481
482 def set_task_factory(self, factory):
483 raise NotImplementedError
484
485 def get_task_factory(self):
486 raise NotImplementedError
487
Yury Selivanov569efa22014-02-18 18:02:19 -0500488 # Error handlers.
489
Yury Selivanov7ed7ce62016-05-16 15:20:38 -0400490 def get_exception_handler(self):
491 raise NotImplementedError
492
Yury Selivanov569efa22014-02-18 18:02:19 -0500493 def set_exception_handler(self, handler):
494 raise NotImplementedError
495
496 def default_exception_handler(self, context):
497 raise NotImplementedError
498
499 def call_exception_handler(self, context):
500 raise NotImplementedError
501
Victor Stinner0f3e6bc2014-02-19 23:15:02 +0100502 # Debug flag management.
503
504 def get_debug(self):
505 raise NotImplementedError
506
507 def set_debug(self, enabled):
508 raise NotImplementedError
509
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700510
511class AbstractEventLoopPolicy:
512 """Abstract policy for accessing the event loop."""
513
514 def get_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200515 """Get the event loop for the current context.
516
517 Returns an event loop object implementing the BaseEventLoop interface,
518 or raises an exception in case no event loop has been set for the
519 current context and the current policy does not specify to create one.
520
521 It should never return None."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700522 raise NotImplementedError
523
524 def set_event_loop(self, loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200525 """Set the event loop for the current context to loop."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700526 raise NotImplementedError
527
528 def new_event_loop(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200529 """Create and return a new event loop object according to this
530 policy's rules. If there's need to set this loop as the event loop for
531 the current context, set_event_loop must be called explicitly."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700532 raise NotImplementedError
533
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800534 # Child processes handling (Unix only).
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700535
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800536 def get_child_watcher(self):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200537 "Get the watcher for child processes."
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800538 raise NotImplementedError
539
540 def set_child_watcher(self, watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200541 """Set the watcher for child processes."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800542 raise NotImplementedError
543
544
545class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy):
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700546 """Default policy implementation for accessing the event loop.
547
548 In this policy, each thread has its own event loop. However, we
549 only automatically create an event loop by default for the main
550 thread; other threads by default have no event loop.
551
552 Other policies may have different rules (e.g. a single global
553 event loop, or automatically creating an event loop per thread, or
554 using some other notion of context to which an event loop is
555 associated).
556 """
557
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800558 _loop_factory = None
559
560 class _Local(threading.local):
561 _loop = None
562 _set_called = False
563
564 def __init__(self):
565 self._local = self._Local()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700566
567 def get_event_loop(self):
568 """Get the event loop.
569
570 This may be None or an instance of EventLoop.
571 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800572 if (self._local._loop is None and
573 not self._local._set_called and
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700574 isinstance(threading.current_thread(), threading._MainThread)):
Guido van Rossumcced0762013-11-27 10:37:13 -0800575 self.set_event_loop(self.new_event_loop())
Victor Stinner3a1c7382014-12-18 01:20:10 +0100576 if self._local._loop is None:
577 raise RuntimeError('There is no current event loop in thread %r.'
578 % threading.current_thread().name)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800579 return self._local._loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700580
581 def set_event_loop(self, loop):
582 """Set the event loop."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800583 self._local._set_called = True
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700584 assert loop is None or isinstance(loop, AbstractEventLoop)
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800585 self._local._loop = loop
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700586
587 def new_event_loop(self):
588 """Create a new event loop.
589
590 You must call set_event_loop() to make this the current event
591 loop.
592 """
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800593 return self._loop_factory()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700594
595
596# Event loop policy. The policy itself is always global, even if the
597# policy's rules say that there is an event loop per thread (or other
598# notion of context). The default policy is installed by the first
599# call to get_event_loop_policy().
600_event_loop_policy = None
601
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800602# Lock for protecting the on-the-fly creation of the event loop policy.
603_lock = threading.Lock()
604
605
606def _init_event_loop_policy():
607 global _event_loop_policy
608 with _lock:
609 if _event_loop_policy is None: # pragma: no branch
610 from . import DefaultEventLoopPolicy
611 _event_loop_policy = DefaultEventLoopPolicy()
612
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700613
614def get_event_loop_policy():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200615 """Get the current event loop policy."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700616 if _event_loop_policy is None:
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800617 _init_event_loop_policy()
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700618 return _event_loop_policy
619
620
621def set_event_loop_policy(policy):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200622 """Set the current event loop policy.
623
624 If policy is None, the default policy is restored."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700625 global _event_loop_policy
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700626 assert policy is None or isinstance(policy, AbstractEventLoopPolicy)
627 _event_loop_policy = policy
628
629
630def get_event_loop():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200631 """Equivalent to calling get_event_loop_policy().get_event_loop()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700632 return get_event_loop_policy().get_event_loop()
633
634
635def set_event_loop(loop):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200636 """Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700637 get_event_loop_policy().set_event_loop(loop)
638
639
640def new_event_loop():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200641 """Equivalent to calling get_event_loop_policy().new_event_loop()."""
Guido van Rossum27b7c7e2013-10-17 13:40:50 -0700642 return get_event_loop_policy().new_event_loop()
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800643
644
645def get_child_watcher():
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200646 """Equivalent to calling get_event_loop_policy().get_child_watcher()."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800647 return get_event_loop_policy().get_child_watcher()
648
649
650def set_child_watcher(watcher):
Victor Stinnerf9e49dd2014-06-05 12:06:44 +0200651 """Equivalent to calling
652 get_event_loop_policy().set_child_watcher(watcher)."""
Guido van Rossum0eaa5ac2013-11-04 15:50:46 -0800653 return get_event_loop_policy().set_child_watcher(watcher)