1*cda5da8dSAndroid Build Coastguard Worker"""Event loop and event loop policy.""" 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Worker__all__ = ( 4*cda5da8dSAndroid Build Coastguard Worker 'AbstractEventLoopPolicy', 5*cda5da8dSAndroid Build Coastguard Worker 'AbstractEventLoop', 'AbstractServer', 6*cda5da8dSAndroid Build Coastguard Worker 'Handle', 'TimerHandle', 7*cda5da8dSAndroid Build Coastguard Worker 'get_event_loop_policy', 'set_event_loop_policy', 8*cda5da8dSAndroid Build Coastguard Worker 'get_event_loop', 'set_event_loop', 'new_event_loop', 9*cda5da8dSAndroid Build Coastguard Worker 'get_child_watcher', 'set_child_watcher', 10*cda5da8dSAndroid Build Coastguard Worker '_set_running_loop', 'get_running_loop', 11*cda5da8dSAndroid Build Coastguard Worker '_get_running_loop', 12*cda5da8dSAndroid Build Coastguard Worker) 13*cda5da8dSAndroid Build Coastguard Worker 14*cda5da8dSAndroid Build Coastguard Workerimport contextvars 15*cda5da8dSAndroid Build Coastguard Workerimport os 16*cda5da8dSAndroid Build Coastguard Workerimport socket 17*cda5da8dSAndroid Build Coastguard Workerimport subprocess 18*cda5da8dSAndroid Build Coastguard Workerimport sys 19*cda5da8dSAndroid Build Coastguard Workerimport threading 20*cda5da8dSAndroid Build Coastguard Worker 21*cda5da8dSAndroid Build Coastguard Workerfrom . import format_helpers 22*cda5da8dSAndroid Build Coastguard Worker 23*cda5da8dSAndroid Build Coastguard Worker 24*cda5da8dSAndroid Build Coastguard Workerclass Handle: 25*cda5da8dSAndroid Build Coastguard Worker """Object returned by callback registration methods.""" 26*cda5da8dSAndroid Build Coastguard Worker 27*cda5da8dSAndroid Build Coastguard Worker __slots__ = ('_callback', '_args', '_cancelled', '_loop', 28*cda5da8dSAndroid Build Coastguard Worker '_source_traceback', '_repr', '__weakref__', 29*cda5da8dSAndroid Build Coastguard Worker '_context') 30*cda5da8dSAndroid Build Coastguard Worker 31*cda5da8dSAndroid Build Coastguard Worker def __init__(self, callback, args, loop, context=None): 32*cda5da8dSAndroid Build Coastguard Worker if context is None: 33*cda5da8dSAndroid Build Coastguard Worker context = contextvars.copy_context() 34*cda5da8dSAndroid Build Coastguard Worker self._context = context 35*cda5da8dSAndroid Build Coastguard Worker self._loop = loop 36*cda5da8dSAndroid Build Coastguard Worker self._callback = callback 37*cda5da8dSAndroid Build Coastguard Worker self._args = args 38*cda5da8dSAndroid Build Coastguard Worker self._cancelled = False 39*cda5da8dSAndroid Build Coastguard Worker self._repr = None 40*cda5da8dSAndroid Build Coastguard Worker if self._loop.get_debug(): 41*cda5da8dSAndroid Build Coastguard Worker self._source_traceback = format_helpers.extract_stack( 42*cda5da8dSAndroid Build Coastguard Worker sys._getframe(1)) 43*cda5da8dSAndroid Build Coastguard Worker else: 44*cda5da8dSAndroid Build Coastguard Worker self._source_traceback = None 45*cda5da8dSAndroid Build Coastguard Worker 46*cda5da8dSAndroid Build Coastguard Worker def _repr_info(self): 47*cda5da8dSAndroid Build Coastguard Worker info = [self.__class__.__name__] 48*cda5da8dSAndroid Build Coastguard Worker if self._cancelled: 49*cda5da8dSAndroid Build Coastguard Worker info.append('cancelled') 50*cda5da8dSAndroid Build Coastguard Worker if self._callback is not None: 51*cda5da8dSAndroid Build Coastguard Worker info.append(format_helpers._format_callback_source( 52*cda5da8dSAndroid Build Coastguard Worker self._callback, self._args)) 53*cda5da8dSAndroid Build Coastguard Worker if self._source_traceback: 54*cda5da8dSAndroid Build Coastguard Worker frame = self._source_traceback[-1] 55*cda5da8dSAndroid Build Coastguard Worker info.append(f'created at {frame[0]}:{frame[1]}') 56*cda5da8dSAndroid Build Coastguard Worker return info 57*cda5da8dSAndroid Build Coastguard Worker 58*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 59*cda5da8dSAndroid Build Coastguard Worker if self._repr is not None: 60*cda5da8dSAndroid Build Coastguard Worker return self._repr 61*cda5da8dSAndroid Build Coastguard Worker info = self._repr_info() 62*cda5da8dSAndroid Build Coastguard Worker return '<{}>'.format(' '.join(info)) 63*cda5da8dSAndroid Build Coastguard Worker 64*cda5da8dSAndroid Build Coastguard Worker def cancel(self): 65*cda5da8dSAndroid Build Coastguard Worker if not self._cancelled: 66*cda5da8dSAndroid Build Coastguard Worker self._cancelled = True 67*cda5da8dSAndroid Build Coastguard Worker if self._loop.get_debug(): 68*cda5da8dSAndroid Build Coastguard Worker # Keep a representation in debug mode to keep callback and 69*cda5da8dSAndroid Build Coastguard Worker # parameters. For example, to log the warning 70*cda5da8dSAndroid Build Coastguard Worker # "Executing <Handle...> took 2.5 second" 71*cda5da8dSAndroid Build Coastguard Worker self._repr = repr(self) 72*cda5da8dSAndroid Build Coastguard Worker self._callback = None 73*cda5da8dSAndroid Build Coastguard Worker self._args = None 74*cda5da8dSAndroid Build Coastguard Worker 75*cda5da8dSAndroid Build Coastguard Worker def cancelled(self): 76*cda5da8dSAndroid Build Coastguard Worker return self._cancelled 77*cda5da8dSAndroid Build Coastguard Worker 78*cda5da8dSAndroid Build Coastguard Worker def _run(self): 79*cda5da8dSAndroid Build Coastguard Worker try: 80*cda5da8dSAndroid Build Coastguard Worker self._context.run(self._callback, *self._args) 81*cda5da8dSAndroid Build Coastguard Worker except (SystemExit, KeyboardInterrupt): 82*cda5da8dSAndroid Build Coastguard Worker raise 83*cda5da8dSAndroid Build Coastguard Worker except BaseException as exc: 84*cda5da8dSAndroid Build Coastguard Worker cb = format_helpers._format_callback_source( 85*cda5da8dSAndroid Build Coastguard Worker self._callback, self._args) 86*cda5da8dSAndroid Build Coastguard Worker msg = f'Exception in callback {cb}' 87*cda5da8dSAndroid Build Coastguard Worker context = { 88*cda5da8dSAndroid Build Coastguard Worker 'message': msg, 89*cda5da8dSAndroid Build Coastguard Worker 'exception': exc, 90*cda5da8dSAndroid Build Coastguard Worker 'handle': self, 91*cda5da8dSAndroid Build Coastguard Worker } 92*cda5da8dSAndroid Build Coastguard Worker if self._source_traceback: 93*cda5da8dSAndroid Build Coastguard Worker context['source_traceback'] = self._source_traceback 94*cda5da8dSAndroid Build Coastguard Worker self._loop.call_exception_handler(context) 95*cda5da8dSAndroid Build Coastguard Worker self = None # Needed to break cycles when an exception occurs. 96*cda5da8dSAndroid Build Coastguard Worker 97*cda5da8dSAndroid Build Coastguard Worker 98*cda5da8dSAndroid Build Coastguard Workerclass TimerHandle(Handle): 99*cda5da8dSAndroid Build Coastguard Worker """Object returned by timed callback registration methods.""" 100*cda5da8dSAndroid Build Coastguard Worker 101*cda5da8dSAndroid Build Coastguard Worker __slots__ = ['_scheduled', '_when'] 102*cda5da8dSAndroid Build Coastguard Worker 103*cda5da8dSAndroid Build Coastguard Worker def __init__(self, when, callback, args, loop, context=None): 104*cda5da8dSAndroid Build Coastguard Worker super().__init__(callback, args, loop, context) 105*cda5da8dSAndroid Build Coastguard Worker if self._source_traceback: 106*cda5da8dSAndroid Build Coastguard Worker del self._source_traceback[-1] 107*cda5da8dSAndroid Build Coastguard Worker self._when = when 108*cda5da8dSAndroid Build Coastguard Worker self._scheduled = False 109*cda5da8dSAndroid Build Coastguard Worker 110*cda5da8dSAndroid Build Coastguard Worker def _repr_info(self): 111*cda5da8dSAndroid Build Coastguard Worker info = super()._repr_info() 112*cda5da8dSAndroid Build Coastguard Worker pos = 2 if self._cancelled else 1 113*cda5da8dSAndroid Build Coastguard Worker info.insert(pos, f'when={self._when}') 114*cda5da8dSAndroid Build Coastguard Worker return info 115*cda5da8dSAndroid Build Coastguard Worker 116*cda5da8dSAndroid Build Coastguard Worker def __hash__(self): 117*cda5da8dSAndroid Build Coastguard Worker return hash(self._when) 118*cda5da8dSAndroid Build Coastguard Worker 119*cda5da8dSAndroid Build Coastguard Worker def __lt__(self, other): 120*cda5da8dSAndroid Build Coastguard Worker if isinstance(other, TimerHandle): 121*cda5da8dSAndroid Build Coastguard Worker return self._when < other._when 122*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 123*cda5da8dSAndroid Build Coastguard Worker 124*cda5da8dSAndroid Build Coastguard Worker def __le__(self, other): 125*cda5da8dSAndroid Build Coastguard Worker if isinstance(other, TimerHandle): 126*cda5da8dSAndroid Build Coastguard Worker return self._when < other._when or self.__eq__(other) 127*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 128*cda5da8dSAndroid Build Coastguard Worker 129*cda5da8dSAndroid Build Coastguard Worker def __gt__(self, other): 130*cda5da8dSAndroid Build Coastguard Worker if isinstance(other, TimerHandle): 131*cda5da8dSAndroid Build Coastguard Worker return self._when > other._when 132*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 133*cda5da8dSAndroid Build Coastguard Worker 134*cda5da8dSAndroid Build Coastguard Worker def __ge__(self, other): 135*cda5da8dSAndroid Build Coastguard Worker if isinstance(other, TimerHandle): 136*cda5da8dSAndroid Build Coastguard Worker return self._when > other._when or self.__eq__(other) 137*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 138*cda5da8dSAndroid Build Coastguard Worker 139*cda5da8dSAndroid Build Coastguard Worker def __eq__(self, other): 140*cda5da8dSAndroid Build Coastguard Worker if isinstance(other, TimerHandle): 141*cda5da8dSAndroid Build Coastguard Worker return (self._when == other._when and 142*cda5da8dSAndroid Build Coastguard Worker self._callback == other._callback and 143*cda5da8dSAndroid Build Coastguard Worker self._args == other._args and 144*cda5da8dSAndroid Build Coastguard Worker self._cancelled == other._cancelled) 145*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 146*cda5da8dSAndroid Build Coastguard Worker 147*cda5da8dSAndroid Build Coastguard Worker def cancel(self): 148*cda5da8dSAndroid Build Coastguard Worker if not self._cancelled: 149*cda5da8dSAndroid Build Coastguard Worker self._loop._timer_handle_cancelled(self) 150*cda5da8dSAndroid Build Coastguard Worker super().cancel() 151*cda5da8dSAndroid Build Coastguard Worker 152*cda5da8dSAndroid Build Coastguard Worker def when(self): 153*cda5da8dSAndroid Build Coastguard Worker """Return a scheduled callback time. 154*cda5da8dSAndroid Build Coastguard Worker 155*cda5da8dSAndroid Build Coastguard Worker The time is an absolute timestamp, using the same time 156*cda5da8dSAndroid Build Coastguard Worker reference as loop.time(). 157*cda5da8dSAndroid Build Coastguard Worker """ 158*cda5da8dSAndroid Build Coastguard Worker return self._when 159*cda5da8dSAndroid Build Coastguard Worker 160*cda5da8dSAndroid Build Coastguard Worker 161*cda5da8dSAndroid Build Coastguard Workerclass AbstractServer: 162*cda5da8dSAndroid Build Coastguard Worker """Abstract server returned by create_server().""" 163*cda5da8dSAndroid Build Coastguard Worker 164*cda5da8dSAndroid Build Coastguard Worker def close(self): 165*cda5da8dSAndroid Build Coastguard Worker """Stop serving. This leaves existing connections open.""" 166*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 167*cda5da8dSAndroid Build Coastguard Worker 168*cda5da8dSAndroid Build Coastguard Worker def get_loop(self): 169*cda5da8dSAndroid Build Coastguard Worker """Get the event loop the Server object is attached to.""" 170*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 171*cda5da8dSAndroid Build Coastguard Worker 172*cda5da8dSAndroid Build Coastguard Worker def is_serving(self): 173*cda5da8dSAndroid Build Coastguard Worker """Return True if the server is accepting connections.""" 174*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 175*cda5da8dSAndroid Build Coastguard Worker 176*cda5da8dSAndroid Build Coastguard Worker async def start_serving(self): 177*cda5da8dSAndroid Build Coastguard Worker """Start accepting connections. 178*cda5da8dSAndroid Build Coastguard Worker 179*cda5da8dSAndroid Build Coastguard Worker This method is idempotent, so it can be called when 180*cda5da8dSAndroid Build Coastguard Worker the server is already being serving. 181*cda5da8dSAndroid Build Coastguard Worker """ 182*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 183*cda5da8dSAndroid Build Coastguard Worker 184*cda5da8dSAndroid Build Coastguard Worker async def serve_forever(self): 185*cda5da8dSAndroid Build Coastguard Worker """Start accepting connections until the coroutine is cancelled. 186*cda5da8dSAndroid Build Coastguard Worker 187*cda5da8dSAndroid Build Coastguard Worker The server is closed when the coroutine is cancelled. 188*cda5da8dSAndroid Build Coastguard Worker """ 189*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 190*cda5da8dSAndroid Build Coastguard Worker 191*cda5da8dSAndroid Build Coastguard Worker async def wait_closed(self): 192*cda5da8dSAndroid Build Coastguard Worker """Coroutine to wait until service is closed.""" 193*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 194*cda5da8dSAndroid Build Coastguard Worker 195*cda5da8dSAndroid Build Coastguard Worker async def __aenter__(self): 196*cda5da8dSAndroid Build Coastguard Worker return self 197*cda5da8dSAndroid Build Coastguard Worker 198*cda5da8dSAndroid Build Coastguard Worker async def __aexit__(self, *exc): 199*cda5da8dSAndroid Build Coastguard Worker self.close() 200*cda5da8dSAndroid Build Coastguard Worker await self.wait_closed() 201*cda5da8dSAndroid Build Coastguard Worker 202*cda5da8dSAndroid Build Coastguard Worker 203*cda5da8dSAndroid Build Coastguard Workerclass AbstractEventLoop: 204*cda5da8dSAndroid Build Coastguard Worker """Abstract event loop.""" 205*cda5da8dSAndroid Build Coastguard Worker 206*cda5da8dSAndroid Build Coastguard Worker # Running and stopping the event loop. 207*cda5da8dSAndroid Build Coastguard Worker 208*cda5da8dSAndroid Build Coastguard Worker def run_forever(self): 209*cda5da8dSAndroid Build Coastguard Worker """Run the event loop until stop() is called.""" 210*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 211*cda5da8dSAndroid Build Coastguard Worker 212*cda5da8dSAndroid Build Coastguard Worker def run_until_complete(self, future): 213*cda5da8dSAndroid Build Coastguard Worker """Run the event loop until a Future is done. 214*cda5da8dSAndroid Build Coastguard Worker 215*cda5da8dSAndroid Build Coastguard Worker Return the Future's result, or raise its exception. 216*cda5da8dSAndroid Build Coastguard Worker """ 217*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 218*cda5da8dSAndroid Build Coastguard Worker 219*cda5da8dSAndroid Build Coastguard Worker def stop(self): 220*cda5da8dSAndroid Build Coastguard Worker """Stop the event loop as soon as reasonable. 221*cda5da8dSAndroid Build Coastguard Worker 222*cda5da8dSAndroid Build Coastguard Worker Exactly how soon that is may depend on the implementation, but 223*cda5da8dSAndroid Build Coastguard Worker no more I/O callbacks should be scheduled. 224*cda5da8dSAndroid Build Coastguard Worker """ 225*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 226*cda5da8dSAndroid Build Coastguard Worker 227*cda5da8dSAndroid Build Coastguard Worker def is_running(self): 228*cda5da8dSAndroid Build Coastguard Worker """Return whether the event loop is currently running.""" 229*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 230*cda5da8dSAndroid Build Coastguard Worker 231*cda5da8dSAndroid Build Coastguard Worker def is_closed(self): 232*cda5da8dSAndroid Build Coastguard Worker """Returns True if the event loop was closed.""" 233*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 234*cda5da8dSAndroid Build Coastguard Worker 235*cda5da8dSAndroid Build Coastguard Worker def close(self): 236*cda5da8dSAndroid Build Coastguard Worker """Close the loop. 237*cda5da8dSAndroid Build Coastguard Worker 238*cda5da8dSAndroid Build Coastguard Worker The loop should not be running. 239*cda5da8dSAndroid Build Coastguard Worker 240*cda5da8dSAndroid Build Coastguard Worker This is idempotent and irreversible. 241*cda5da8dSAndroid Build Coastguard Worker 242*cda5da8dSAndroid Build Coastguard Worker No other methods should be called after this one. 243*cda5da8dSAndroid Build Coastguard Worker """ 244*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 245*cda5da8dSAndroid Build Coastguard Worker 246*cda5da8dSAndroid Build Coastguard Worker async def shutdown_asyncgens(self): 247*cda5da8dSAndroid Build Coastguard Worker """Shutdown all active asynchronous generators.""" 248*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 249*cda5da8dSAndroid Build Coastguard Worker 250*cda5da8dSAndroid Build Coastguard Worker async def shutdown_default_executor(self): 251*cda5da8dSAndroid Build Coastguard Worker """Schedule the shutdown of the default executor.""" 252*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 253*cda5da8dSAndroid Build Coastguard Worker 254*cda5da8dSAndroid Build Coastguard Worker # Methods scheduling callbacks. All these return Handles. 255*cda5da8dSAndroid Build Coastguard Worker 256*cda5da8dSAndroid Build Coastguard Worker def _timer_handle_cancelled(self, handle): 257*cda5da8dSAndroid Build Coastguard Worker """Notification that a TimerHandle has been cancelled.""" 258*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 259*cda5da8dSAndroid Build Coastguard Worker 260*cda5da8dSAndroid Build Coastguard Worker def call_soon(self, callback, *args, context=None): 261*cda5da8dSAndroid Build Coastguard Worker return self.call_later(0, callback, *args, context=context) 262*cda5da8dSAndroid Build Coastguard Worker 263*cda5da8dSAndroid Build Coastguard Worker def call_later(self, delay, callback, *args, context=None): 264*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 265*cda5da8dSAndroid Build Coastguard Worker 266*cda5da8dSAndroid Build Coastguard Worker def call_at(self, when, callback, *args, context=None): 267*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 268*cda5da8dSAndroid Build Coastguard Worker 269*cda5da8dSAndroid Build Coastguard Worker def time(self): 270*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 271*cda5da8dSAndroid Build Coastguard Worker 272*cda5da8dSAndroid Build Coastguard Worker def create_future(self): 273*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 274*cda5da8dSAndroid Build Coastguard Worker 275*cda5da8dSAndroid Build Coastguard Worker # Method scheduling a coroutine object: create a task. 276*cda5da8dSAndroid Build Coastguard Worker 277*cda5da8dSAndroid Build Coastguard Worker def create_task(self, coro, *, name=None, context=None): 278*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 279*cda5da8dSAndroid Build Coastguard Worker 280*cda5da8dSAndroid Build Coastguard Worker # Methods for interacting with threads. 281*cda5da8dSAndroid Build Coastguard Worker 282*cda5da8dSAndroid Build Coastguard Worker def call_soon_threadsafe(self, callback, *args, context=None): 283*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 284*cda5da8dSAndroid Build Coastguard Worker 285*cda5da8dSAndroid Build Coastguard Worker def run_in_executor(self, executor, func, *args): 286*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 287*cda5da8dSAndroid Build Coastguard Worker 288*cda5da8dSAndroid Build Coastguard Worker def set_default_executor(self, executor): 289*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 290*cda5da8dSAndroid Build Coastguard Worker 291*cda5da8dSAndroid Build Coastguard Worker # Network I/O methods returning Futures. 292*cda5da8dSAndroid Build Coastguard Worker 293*cda5da8dSAndroid Build Coastguard Worker async def getaddrinfo(self, host, port, *, 294*cda5da8dSAndroid Build Coastguard Worker family=0, type=0, proto=0, flags=0): 295*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 296*cda5da8dSAndroid Build Coastguard Worker 297*cda5da8dSAndroid Build Coastguard Worker async def getnameinfo(self, sockaddr, flags=0): 298*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 299*cda5da8dSAndroid Build Coastguard Worker 300*cda5da8dSAndroid Build Coastguard Worker async def create_connection( 301*cda5da8dSAndroid Build Coastguard Worker self, protocol_factory, host=None, port=None, 302*cda5da8dSAndroid Build Coastguard Worker *, ssl=None, family=0, proto=0, 303*cda5da8dSAndroid Build Coastguard Worker flags=0, sock=None, local_addr=None, 304*cda5da8dSAndroid Build Coastguard Worker server_hostname=None, 305*cda5da8dSAndroid Build Coastguard Worker ssl_handshake_timeout=None, 306*cda5da8dSAndroid Build Coastguard Worker ssl_shutdown_timeout=None, 307*cda5da8dSAndroid Build Coastguard Worker happy_eyeballs_delay=None, interleave=None): 308*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 309*cda5da8dSAndroid Build Coastguard Worker 310*cda5da8dSAndroid Build Coastguard Worker async def create_server( 311*cda5da8dSAndroid Build Coastguard Worker self, protocol_factory, host=None, port=None, 312*cda5da8dSAndroid Build Coastguard Worker *, family=socket.AF_UNSPEC, 313*cda5da8dSAndroid Build Coastguard Worker flags=socket.AI_PASSIVE, sock=None, backlog=100, 314*cda5da8dSAndroid Build Coastguard Worker ssl=None, reuse_address=None, reuse_port=None, 315*cda5da8dSAndroid Build Coastguard Worker ssl_handshake_timeout=None, 316*cda5da8dSAndroid Build Coastguard Worker ssl_shutdown_timeout=None, 317*cda5da8dSAndroid Build Coastguard Worker start_serving=True): 318*cda5da8dSAndroid Build Coastguard Worker """A coroutine which creates a TCP server bound to host and port. 319*cda5da8dSAndroid Build Coastguard Worker 320*cda5da8dSAndroid Build Coastguard Worker The return value is a Server object which can be used to stop 321*cda5da8dSAndroid Build Coastguard Worker the service. 322*cda5da8dSAndroid Build Coastguard Worker 323*cda5da8dSAndroid Build Coastguard Worker If host is an empty string or None all interfaces are assumed 324*cda5da8dSAndroid Build Coastguard Worker and a list of multiple sockets will be returned (most likely 325*cda5da8dSAndroid Build Coastguard Worker one for IPv4 and another one for IPv6). The host parameter can also be 326*cda5da8dSAndroid Build Coastguard Worker a sequence (e.g. list) of hosts to bind to. 327*cda5da8dSAndroid Build Coastguard Worker 328*cda5da8dSAndroid Build Coastguard Worker family can be set to either AF_INET or AF_INET6 to force the 329*cda5da8dSAndroid Build Coastguard Worker socket to use IPv4 or IPv6. If not set it will be determined 330*cda5da8dSAndroid Build Coastguard Worker from host (defaults to AF_UNSPEC). 331*cda5da8dSAndroid Build Coastguard Worker 332*cda5da8dSAndroid Build Coastguard Worker flags is a bitmask for getaddrinfo(). 333*cda5da8dSAndroid Build Coastguard Worker 334*cda5da8dSAndroid Build Coastguard Worker sock can optionally be specified in order to use a preexisting 335*cda5da8dSAndroid Build Coastguard Worker socket object. 336*cda5da8dSAndroid Build Coastguard Worker 337*cda5da8dSAndroid Build Coastguard Worker backlog is the maximum number of queued connections passed to 338*cda5da8dSAndroid Build Coastguard Worker listen() (defaults to 100). 339*cda5da8dSAndroid Build Coastguard Worker 340*cda5da8dSAndroid Build Coastguard Worker ssl can be set to an SSLContext to enable SSL over the 341*cda5da8dSAndroid Build Coastguard Worker accepted connections. 342*cda5da8dSAndroid Build Coastguard Worker 343*cda5da8dSAndroid Build Coastguard Worker reuse_address tells the kernel to reuse a local socket in 344*cda5da8dSAndroid Build Coastguard Worker TIME_WAIT state, without waiting for its natural timeout to 345*cda5da8dSAndroid Build Coastguard Worker expire. If not specified will automatically be set to True on 346*cda5da8dSAndroid Build Coastguard Worker UNIX. 347*cda5da8dSAndroid Build Coastguard Worker 348*cda5da8dSAndroid Build Coastguard Worker reuse_port tells the kernel to allow this endpoint to be bound to 349*cda5da8dSAndroid Build Coastguard Worker the same port as other existing endpoints are bound to, so long as 350*cda5da8dSAndroid Build Coastguard Worker they all set this flag when being created. This option is not 351*cda5da8dSAndroid Build Coastguard Worker supported on Windows. 352*cda5da8dSAndroid Build Coastguard Worker 353*cda5da8dSAndroid Build Coastguard Worker ssl_handshake_timeout is the time in seconds that an SSL server 354*cda5da8dSAndroid Build Coastguard Worker will wait for completion of the SSL handshake before aborting the 355*cda5da8dSAndroid Build Coastguard Worker connection. Default is 60s. 356*cda5da8dSAndroid Build Coastguard Worker 357*cda5da8dSAndroid Build Coastguard Worker ssl_shutdown_timeout is the time in seconds that an SSL server 358*cda5da8dSAndroid Build Coastguard Worker will wait for completion of the SSL shutdown procedure 359*cda5da8dSAndroid Build Coastguard Worker before aborting the connection. Default is 30s. 360*cda5da8dSAndroid Build Coastguard Worker 361*cda5da8dSAndroid Build Coastguard Worker start_serving set to True (default) causes the created server 362*cda5da8dSAndroid Build Coastguard Worker to start accepting connections immediately. When set to False, 363*cda5da8dSAndroid Build Coastguard Worker the user should await Server.start_serving() or Server.serve_forever() 364*cda5da8dSAndroid Build Coastguard Worker to make the server to start accepting connections. 365*cda5da8dSAndroid Build Coastguard Worker """ 366*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 367*cda5da8dSAndroid Build Coastguard Worker 368*cda5da8dSAndroid Build Coastguard Worker async def sendfile(self, transport, file, offset=0, count=None, 369*cda5da8dSAndroid Build Coastguard Worker *, fallback=True): 370*cda5da8dSAndroid Build Coastguard Worker """Send a file through a transport. 371*cda5da8dSAndroid Build Coastguard Worker 372*cda5da8dSAndroid Build Coastguard Worker Return an amount of sent bytes. 373*cda5da8dSAndroid Build Coastguard Worker """ 374*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 375*cda5da8dSAndroid Build Coastguard Worker 376*cda5da8dSAndroid Build Coastguard Worker async def start_tls(self, transport, protocol, sslcontext, *, 377*cda5da8dSAndroid Build Coastguard Worker server_side=False, 378*cda5da8dSAndroid Build Coastguard Worker server_hostname=None, 379*cda5da8dSAndroid Build Coastguard Worker ssl_handshake_timeout=None, 380*cda5da8dSAndroid Build Coastguard Worker ssl_shutdown_timeout=None): 381*cda5da8dSAndroid Build Coastguard Worker """Upgrade a transport to TLS. 382*cda5da8dSAndroid Build Coastguard Worker 383*cda5da8dSAndroid Build Coastguard Worker Return a new transport that *protocol* should start using 384*cda5da8dSAndroid Build Coastguard Worker immediately. 385*cda5da8dSAndroid Build Coastguard Worker """ 386*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 387*cda5da8dSAndroid Build Coastguard Worker 388*cda5da8dSAndroid Build Coastguard Worker async def create_unix_connection( 389*cda5da8dSAndroid Build Coastguard Worker self, protocol_factory, path=None, *, 390*cda5da8dSAndroid Build Coastguard Worker ssl=None, sock=None, 391*cda5da8dSAndroid Build Coastguard Worker server_hostname=None, 392*cda5da8dSAndroid Build Coastguard Worker ssl_handshake_timeout=None, 393*cda5da8dSAndroid Build Coastguard Worker ssl_shutdown_timeout=None): 394*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 395*cda5da8dSAndroid Build Coastguard Worker 396*cda5da8dSAndroid Build Coastguard Worker async def create_unix_server( 397*cda5da8dSAndroid Build Coastguard Worker self, protocol_factory, path=None, *, 398*cda5da8dSAndroid Build Coastguard Worker sock=None, backlog=100, ssl=None, 399*cda5da8dSAndroid Build Coastguard Worker ssl_handshake_timeout=None, 400*cda5da8dSAndroid Build Coastguard Worker ssl_shutdown_timeout=None, 401*cda5da8dSAndroid Build Coastguard Worker start_serving=True): 402*cda5da8dSAndroid Build Coastguard Worker """A coroutine which creates a UNIX Domain Socket server. 403*cda5da8dSAndroid Build Coastguard Worker 404*cda5da8dSAndroid Build Coastguard Worker The return value is a Server object, which can be used to stop 405*cda5da8dSAndroid Build Coastguard Worker the service. 406*cda5da8dSAndroid Build Coastguard Worker 407*cda5da8dSAndroid Build Coastguard Worker path is a str, representing a file system path to bind the 408*cda5da8dSAndroid Build Coastguard Worker server socket to. 409*cda5da8dSAndroid Build Coastguard Worker 410*cda5da8dSAndroid Build Coastguard Worker sock can optionally be specified in order to use a preexisting 411*cda5da8dSAndroid Build Coastguard Worker socket object. 412*cda5da8dSAndroid Build Coastguard Worker 413*cda5da8dSAndroid Build Coastguard Worker backlog is the maximum number of queued connections passed to 414*cda5da8dSAndroid Build Coastguard Worker listen() (defaults to 100). 415*cda5da8dSAndroid Build Coastguard Worker 416*cda5da8dSAndroid Build Coastguard Worker ssl can be set to an SSLContext to enable SSL over the 417*cda5da8dSAndroid Build Coastguard Worker accepted connections. 418*cda5da8dSAndroid Build Coastguard Worker 419*cda5da8dSAndroid Build Coastguard Worker ssl_handshake_timeout is the time in seconds that an SSL server 420*cda5da8dSAndroid Build Coastguard Worker will wait for the SSL handshake to complete (defaults to 60s). 421*cda5da8dSAndroid Build Coastguard Worker 422*cda5da8dSAndroid Build Coastguard Worker ssl_shutdown_timeout is the time in seconds that an SSL server 423*cda5da8dSAndroid Build Coastguard Worker will wait for the SSL shutdown to finish (defaults to 30s). 424*cda5da8dSAndroid Build Coastguard Worker 425*cda5da8dSAndroid Build Coastguard Worker start_serving set to True (default) causes the created server 426*cda5da8dSAndroid Build Coastguard Worker to start accepting connections immediately. When set to False, 427*cda5da8dSAndroid Build Coastguard Worker the user should await Server.start_serving() or Server.serve_forever() 428*cda5da8dSAndroid Build Coastguard Worker to make the server to start accepting connections. 429*cda5da8dSAndroid Build Coastguard Worker """ 430*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 431*cda5da8dSAndroid Build Coastguard Worker 432*cda5da8dSAndroid Build Coastguard Worker async def connect_accepted_socket( 433*cda5da8dSAndroid Build Coastguard Worker self, protocol_factory, sock, 434*cda5da8dSAndroid Build Coastguard Worker *, ssl=None, 435*cda5da8dSAndroid Build Coastguard Worker ssl_handshake_timeout=None, 436*cda5da8dSAndroid Build Coastguard Worker ssl_shutdown_timeout=None): 437*cda5da8dSAndroid Build Coastguard Worker """Handle an accepted connection. 438*cda5da8dSAndroid Build Coastguard Worker 439*cda5da8dSAndroid Build Coastguard Worker This is used by servers that accept connections outside of 440*cda5da8dSAndroid Build Coastguard Worker asyncio, but use asyncio to handle connections. 441*cda5da8dSAndroid Build Coastguard Worker 442*cda5da8dSAndroid Build Coastguard Worker This method is a coroutine. When completed, the coroutine 443*cda5da8dSAndroid Build Coastguard Worker returns a (transport, protocol) pair. 444*cda5da8dSAndroid Build Coastguard Worker """ 445*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 446*cda5da8dSAndroid Build Coastguard Worker 447*cda5da8dSAndroid Build Coastguard Worker async def create_datagram_endpoint(self, protocol_factory, 448*cda5da8dSAndroid Build Coastguard Worker local_addr=None, remote_addr=None, *, 449*cda5da8dSAndroid Build Coastguard Worker family=0, proto=0, flags=0, 450*cda5da8dSAndroid Build Coastguard Worker reuse_address=None, reuse_port=None, 451*cda5da8dSAndroid Build Coastguard Worker allow_broadcast=None, sock=None): 452*cda5da8dSAndroid Build Coastguard Worker """A coroutine which creates a datagram endpoint. 453*cda5da8dSAndroid Build Coastguard Worker 454*cda5da8dSAndroid Build Coastguard Worker This method will try to establish the endpoint in the background. 455*cda5da8dSAndroid Build Coastguard Worker When successful, the coroutine returns a (transport, protocol) pair. 456*cda5da8dSAndroid Build Coastguard Worker 457*cda5da8dSAndroid Build Coastguard Worker protocol_factory must be a callable returning a protocol instance. 458*cda5da8dSAndroid Build Coastguard Worker 459*cda5da8dSAndroid Build Coastguard Worker socket family AF_INET, socket.AF_INET6 or socket.AF_UNIX depending on 460*cda5da8dSAndroid Build Coastguard Worker host (or family if specified), socket type SOCK_DGRAM. 461*cda5da8dSAndroid Build Coastguard Worker 462*cda5da8dSAndroid Build Coastguard Worker reuse_address tells the kernel to reuse a local socket in 463*cda5da8dSAndroid Build Coastguard Worker TIME_WAIT state, without waiting for its natural timeout to 464*cda5da8dSAndroid Build Coastguard Worker expire. If not specified it will automatically be set to True on 465*cda5da8dSAndroid Build Coastguard Worker UNIX. 466*cda5da8dSAndroid Build Coastguard Worker 467*cda5da8dSAndroid Build Coastguard Worker reuse_port tells the kernel to allow this endpoint to be bound to 468*cda5da8dSAndroid Build Coastguard Worker the same port as other existing endpoints are bound to, so long as 469*cda5da8dSAndroid Build Coastguard Worker they all set this flag when being created. This option is not 470*cda5da8dSAndroid Build Coastguard Worker supported on Windows and some UNIX's. If the 471*cda5da8dSAndroid Build Coastguard Worker :py:data:`~socket.SO_REUSEPORT` constant is not defined then this 472*cda5da8dSAndroid Build Coastguard Worker capability is unsupported. 473*cda5da8dSAndroid Build Coastguard Worker 474*cda5da8dSAndroid Build Coastguard Worker allow_broadcast tells the kernel to allow this endpoint to send 475*cda5da8dSAndroid Build Coastguard Worker messages to the broadcast address. 476*cda5da8dSAndroid Build Coastguard Worker 477*cda5da8dSAndroid Build Coastguard Worker sock can optionally be specified in order to use a preexisting 478*cda5da8dSAndroid Build Coastguard Worker socket object. 479*cda5da8dSAndroid Build Coastguard Worker """ 480*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 481*cda5da8dSAndroid Build Coastguard Worker 482*cda5da8dSAndroid Build Coastguard Worker # Pipes and subprocesses. 483*cda5da8dSAndroid Build Coastguard Worker 484*cda5da8dSAndroid Build Coastguard Worker async def connect_read_pipe(self, protocol_factory, pipe): 485*cda5da8dSAndroid Build Coastguard Worker """Register read pipe in event loop. Set the pipe to non-blocking mode. 486*cda5da8dSAndroid Build Coastguard Worker 487*cda5da8dSAndroid Build Coastguard Worker protocol_factory should instantiate object with Protocol interface. 488*cda5da8dSAndroid Build Coastguard Worker pipe is a file-like object. 489*cda5da8dSAndroid Build Coastguard Worker Return pair (transport, protocol), where transport supports the 490*cda5da8dSAndroid Build Coastguard Worker ReadTransport interface.""" 491*cda5da8dSAndroid Build Coastguard Worker # The reason to accept file-like object instead of just file descriptor 492*cda5da8dSAndroid Build Coastguard Worker # is: we need to own pipe and close it at transport finishing 493*cda5da8dSAndroid Build Coastguard Worker # Can got complicated errors if pass f.fileno(), 494*cda5da8dSAndroid Build Coastguard Worker # close fd in pipe transport then close f and vice versa. 495*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 496*cda5da8dSAndroid Build Coastguard Worker 497*cda5da8dSAndroid Build Coastguard Worker async def connect_write_pipe(self, protocol_factory, pipe): 498*cda5da8dSAndroid Build Coastguard Worker """Register write pipe in event loop. 499*cda5da8dSAndroid Build Coastguard Worker 500*cda5da8dSAndroid Build Coastguard Worker protocol_factory should instantiate object with BaseProtocol interface. 501*cda5da8dSAndroid Build Coastguard Worker Pipe is file-like object already switched to nonblocking. 502*cda5da8dSAndroid Build Coastguard Worker Return pair (transport, protocol), where transport support 503*cda5da8dSAndroid Build Coastguard Worker WriteTransport interface.""" 504*cda5da8dSAndroid Build Coastguard Worker # The reason to accept file-like object instead of just file descriptor 505*cda5da8dSAndroid Build Coastguard Worker # is: we need to own pipe and close it at transport finishing 506*cda5da8dSAndroid Build Coastguard Worker # Can got complicated errors if pass f.fileno(), 507*cda5da8dSAndroid Build Coastguard Worker # close fd in pipe transport then close f and vice versa. 508*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 509*cda5da8dSAndroid Build Coastguard Worker 510*cda5da8dSAndroid Build Coastguard Worker async def subprocess_shell(self, protocol_factory, cmd, *, 511*cda5da8dSAndroid Build Coastguard Worker stdin=subprocess.PIPE, 512*cda5da8dSAndroid Build Coastguard Worker stdout=subprocess.PIPE, 513*cda5da8dSAndroid Build Coastguard Worker stderr=subprocess.PIPE, 514*cda5da8dSAndroid Build Coastguard Worker **kwargs): 515*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 516*cda5da8dSAndroid Build Coastguard Worker 517*cda5da8dSAndroid Build Coastguard Worker async def subprocess_exec(self, protocol_factory, *args, 518*cda5da8dSAndroid Build Coastguard Worker stdin=subprocess.PIPE, 519*cda5da8dSAndroid Build Coastguard Worker stdout=subprocess.PIPE, 520*cda5da8dSAndroid Build Coastguard Worker stderr=subprocess.PIPE, 521*cda5da8dSAndroid Build Coastguard Worker **kwargs): 522*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 523*cda5da8dSAndroid Build Coastguard Worker 524*cda5da8dSAndroid Build Coastguard Worker # Ready-based callback registration methods. 525*cda5da8dSAndroid Build Coastguard Worker # The add_*() methods return None. 526*cda5da8dSAndroid Build Coastguard Worker # The remove_*() methods return True if something was removed, 527*cda5da8dSAndroid Build Coastguard Worker # False if there was nothing to delete. 528*cda5da8dSAndroid Build Coastguard Worker 529*cda5da8dSAndroid Build Coastguard Worker def add_reader(self, fd, callback, *args): 530*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 531*cda5da8dSAndroid Build Coastguard Worker 532*cda5da8dSAndroid Build Coastguard Worker def remove_reader(self, fd): 533*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 534*cda5da8dSAndroid Build Coastguard Worker 535*cda5da8dSAndroid Build Coastguard Worker def add_writer(self, fd, callback, *args): 536*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 537*cda5da8dSAndroid Build Coastguard Worker 538*cda5da8dSAndroid Build Coastguard Worker def remove_writer(self, fd): 539*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 540*cda5da8dSAndroid Build Coastguard Worker 541*cda5da8dSAndroid Build Coastguard Worker # Completion based I/O methods returning Futures. 542*cda5da8dSAndroid Build Coastguard Worker 543*cda5da8dSAndroid Build Coastguard Worker async def sock_recv(self, sock, nbytes): 544*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 545*cda5da8dSAndroid Build Coastguard Worker 546*cda5da8dSAndroid Build Coastguard Worker async def sock_recv_into(self, sock, buf): 547*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 548*cda5da8dSAndroid Build Coastguard Worker 549*cda5da8dSAndroid Build Coastguard Worker async def sock_recvfrom(self, sock, bufsize): 550*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 551*cda5da8dSAndroid Build Coastguard Worker 552*cda5da8dSAndroid Build Coastguard Worker async def sock_recvfrom_into(self, sock, buf, nbytes=0): 553*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 554*cda5da8dSAndroid Build Coastguard Worker 555*cda5da8dSAndroid Build Coastguard Worker async def sock_sendall(self, sock, data): 556*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 557*cda5da8dSAndroid Build Coastguard Worker 558*cda5da8dSAndroid Build Coastguard Worker async def sock_sendto(self, sock, data, address): 559*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 560*cda5da8dSAndroid Build Coastguard Worker 561*cda5da8dSAndroid Build Coastguard Worker async def sock_connect(self, sock, address): 562*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 563*cda5da8dSAndroid Build Coastguard Worker 564*cda5da8dSAndroid Build Coastguard Worker async def sock_accept(self, sock): 565*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 566*cda5da8dSAndroid Build Coastguard Worker 567*cda5da8dSAndroid Build Coastguard Worker async def sock_sendfile(self, sock, file, offset=0, count=None, 568*cda5da8dSAndroid Build Coastguard Worker *, fallback=None): 569*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 570*cda5da8dSAndroid Build Coastguard Worker 571*cda5da8dSAndroid Build Coastguard Worker # Signal handling. 572*cda5da8dSAndroid Build Coastguard Worker 573*cda5da8dSAndroid Build Coastguard Worker def add_signal_handler(self, sig, callback, *args): 574*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 575*cda5da8dSAndroid Build Coastguard Worker 576*cda5da8dSAndroid Build Coastguard Worker def remove_signal_handler(self, sig): 577*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 578*cda5da8dSAndroid Build Coastguard Worker 579*cda5da8dSAndroid Build Coastguard Worker # Task factory. 580*cda5da8dSAndroid Build Coastguard Worker 581*cda5da8dSAndroid Build Coastguard Worker def set_task_factory(self, factory): 582*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 583*cda5da8dSAndroid Build Coastguard Worker 584*cda5da8dSAndroid Build Coastguard Worker def get_task_factory(self): 585*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 586*cda5da8dSAndroid Build Coastguard Worker 587*cda5da8dSAndroid Build Coastguard Worker # Error handlers. 588*cda5da8dSAndroid Build Coastguard Worker 589*cda5da8dSAndroid Build Coastguard Worker def get_exception_handler(self): 590*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 591*cda5da8dSAndroid Build Coastguard Worker 592*cda5da8dSAndroid Build Coastguard Worker def set_exception_handler(self, handler): 593*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 594*cda5da8dSAndroid Build Coastguard Worker 595*cda5da8dSAndroid Build Coastguard Worker def default_exception_handler(self, context): 596*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 597*cda5da8dSAndroid Build Coastguard Worker 598*cda5da8dSAndroid Build Coastguard Worker def call_exception_handler(self, context): 599*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 600*cda5da8dSAndroid Build Coastguard Worker 601*cda5da8dSAndroid Build Coastguard Worker # Debug flag management. 602*cda5da8dSAndroid Build Coastguard Worker 603*cda5da8dSAndroid Build Coastguard Worker def get_debug(self): 604*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 605*cda5da8dSAndroid Build Coastguard Worker 606*cda5da8dSAndroid Build Coastguard Worker def set_debug(self, enabled): 607*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 608*cda5da8dSAndroid Build Coastguard Worker 609*cda5da8dSAndroid Build Coastguard Worker 610*cda5da8dSAndroid Build Coastguard Workerclass AbstractEventLoopPolicy: 611*cda5da8dSAndroid Build Coastguard Worker """Abstract policy for accessing the event loop.""" 612*cda5da8dSAndroid Build Coastguard Worker 613*cda5da8dSAndroid Build Coastguard Worker def get_event_loop(self): 614*cda5da8dSAndroid Build Coastguard Worker """Get the event loop for the current context. 615*cda5da8dSAndroid Build Coastguard Worker 616*cda5da8dSAndroid Build Coastguard Worker Returns an event loop object implementing the BaseEventLoop interface, 617*cda5da8dSAndroid Build Coastguard Worker or raises an exception in case no event loop has been set for the 618*cda5da8dSAndroid Build Coastguard Worker current context and the current policy does not specify to create one. 619*cda5da8dSAndroid Build Coastguard Worker 620*cda5da8dSAndroid Build Coastguard Worker It should never return None.""" 621*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 622*cda5da8dSAndroid Build Coastguard Worker 623*cda5da8dSAndroid Build Coastguard Worker def set_event_loop(self, loop): 624*cda5da8dSAndroid Build Coastguard Worker """Set the event loop for the current context to loop.""" 625*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 626*cda5da8dSAndroid Build Coastguard Worker 627*cda5da8dSAndroid Build Coastguard Worker def new_event_loop(self): 628*cda5da8dSAndroid Build Coastguard Worker """Create and return a new event loop object according to this 629*cda5da8dSAndroid Build Coastguard Worker policy's rules. If there's need to set this loop as the event loop for 630*cda5da8dSAndroid Build Coastguard Worker the current context, set_event_loop must be called explicitly.""" 631*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 632*cda5da8dSAndroid Build Coastguard Worker 633*cda5da8dSAndroid Build Coastguard Worker # Child processes handling (Unix only). 634*cda5da8dSAndroid Build Coastguard Worker 635*cda5da8dSAndroid Build Coastguard Worker def get_child_watcher(self): 636*cda5da8dSAndroid Build Coastguard Worker "Get the watcher for child processes." 637*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 638*cda5da8dSAndroid Build Coastguard Worker 639*cda5da8dSAndroid Build Coastguard Worker def set_child_watcher(self, watcher): 640*cda5da8dSAndroid Build Coastguard Worker """Set the watcher for child processes.""" 641*cda5da8dSAndroid Build Coastguard Worker raise NotImplementedError 642*cda5da8dSAndroid Build Coastguard Worker 643*cda5da8dSAndroid Build Coastguard Worker 644*cda5da8dSAndroid Build Coastguard Workerclass BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy): 645*cda5da8dSAndroid Build Coastguard Worker """Default policy implementation for accessing the event loop. 646*cda5da8dSAndroid Build Coastguard Worker 647*cda5da8dSAndroid Build Coastguard Worker In this policy, each thread has its own event loop. However, we 648*cda5da8dSAndroid Build Coastguard Worker only automatically create an event loop by default for the main 649*cda5da8dSAndroid Build Coastguard Worker thread; other threads by default have no event loop. 650*cda5da8dSAndroid Build Coastguard Worker 651*cda5da8dSAndroid Build Coastguard Worker Other policies may have different rules (e.g. a single global 652*cda5da8dSAndroid Build Coastguard Worker event loop, or automatically creating an event loop per thread, or 653*cda5da8dSAndroid Build Coastguard Worker using some other notion of context to which an event loop is 654*cda5da8dSAndroid Build Coastguard Worker associated). 655*cda5da8dSAndroid Build Coastguard Worker """ 656*cda5da8dSAndroid Build Coastguard Worker 657*cda5da8dSAndroid Build Coastguard Worker _loop_factory = None 658*cda5da8dSAndroid Build Coastguard Worker 659*cda5da8dSAndroid Build Coastguard Worker class _Local(threading.local): 660*cda5da8dSAndroid Build Coastguard Worker _loop = None 661*cda5da8dSAndroid Build Coastguard Worker _set_called = False 662*cda5da8dSAndroid Build Coastguard Worker 663*cda5da8dSAndroid Build Coastguard Worker def __init__(self): 664*cda5da8dSAndroid Build Coastguard Worker self._local = self._Local() 665*cda5da8dSAndroid Build Coastguard Worker 666*cda5da8dSAndroid Build Coastguard Worker def get_event_loop(self): 667*cda5da8dSAndroid Build Coastguard Worker """Get the event loop for the current context. 668*cda5da8dSAndroid Build Coastguard Worker 669*cda5da8dSAndroid Build Coastguard Worker Returns an instance of EventLoop or raises an exception. 670*cda5da8dSAndroid Build Coastguard Worker """ 671*cda5da8dSAndroid Build Coastguard Worker if (self._local._loop is None and 672*cda5da8dSAndroid Build Coastguard Worker not self._local._set_called and 673*cda5da8dSAndroid Build Coastguard Worker threading.current_thread() is threading.main_thread()): 674*cda5da8dSAndroid Build Coastguard Worker self.set_event_loop(self.new_event_loop()) 675*cda5da8dSAndroid Build Coastguard Worker 676*cda5da8dSAndroid Build Coastguard Worker if self._local._loop is None: 677*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError('There is no current event loop in thread %r.' 678*cda5da8dSAndroid Build Coastguard Worker % threading.current_thread().name) 679*cda5da8dSAndroid Build Coastguard Worker 680*cda5da8dSAndroid Build Coastguard Worker return self._local._loop 681*cda5da8dSAndroid Build Coastguard Worker 682*cda5da8dSAndroid Build Coastguard Worker def set_event_loop(self, loop): 683*cda5da8dSAndroid Build Coastguard Worker """Set the event loop.""" 684*cda5da8dSAndroid Build Coastguard Worker self._local._set_called = True 685*cda5da8dSAndroid Build Coastguard Worker if loop is not None and not isinstance(loop, AbstractEventLoop): 686*cda5da8dSAndroid Build Coastguard Worker raise TypeError(f"loop must be an instance of AbstractEventLoop or None, not '{type(loop).__name__}'") 687*cda5da8dSAndroid Build Coastguard Worker self._local._loop = loop 688*cda5da8dSAndroid Build Coastguard Worker 689*cda5da8dSAndroid Build Coastguard Worker def new_event_loop(self): 690*cda5da8dSAndroid Build Coastguard Worker """Create a new event loop. 691*cda5da8dSAndroid Build Coastguard Worker 692*cda5da8dSAndroid Build Coastguard Worker You must call set_event_loop() to make this the current event 693*cda5da8dSAndroid Build Coastguard Worker loop. 694*cda5da8dSAndroid Build Coastguard Worker """ 695*cda5da8dSAndroid Build Coastguard Worker return self._loop_factory() 696*cda5da8dSAndroid Build Coastguard Worker 697*cda5da8dSAndroid Build Coastguard Worker 698*cda5da8dSAndroid Build Coastguard Worker# Event loop policy. The policy itself is always global, even if the 699*cda5da8dSAndroid Build Coastguard Worker# policy's rules say that there is an event loop per thread (or other 700*cda5da8dSAndroid Build Coastguard Worker# notion of context). The default policy is installed by the first 701*cda5da8dSAndroid Build Coastguard Worker# call to get_event_loop_policy(). 702*cda5da8dSAndroid Build Coastguard Worker_event_loop_policy = None 703*cda5da8dSAndroid Build Coastguard Worker 704*cda5da8dSAndroid Build Coastguard Worker# Lock for protecting the on-the-fly creation of the event loop policy. 705*cda5da8dSAndroid Build Coastguard Worker_lock = threading.Lock() 706*cda5da8dSAndroid Build Coastguard Worker 707*cda5da8dSAndroid Build Coastguard Worker 708*cda5da8dSAndroid Build Coastguard Worker# A TLS for the running event loop, used by _get_running_loop. 709*cda5da8dSAndroid Build Coastguard Workerclass _RunningLoop(threading.local): 710*cda5da8dSAndroid Build Coastguard Worker loop_pid = (None, None) 711*cda5da8dSAndroid Build Coastguard Worker 712*cda5da8dSAndroid Build Coastguard Worker 713*cda5da8dSAndroid Build Coastguard Worker_running_loop = _RunningLoop() 714*cda5da8dSAndroid Build Coastguard Worker 715*cda5da8dSAndroid Build Coastguard Worker 716*cda5da8dSAndroid Build Coastguard Workerdef get_running_loop(): 717*cda5da8dSAndroid Build Coastguard Worker """Return the running event loop. Raise a RuntimeError if there is none. 718*cda5da8dSAndroid Build Coastguard Worker 719*cda5da8dSAndroid Build Coastguard Worker This function is thread-specific. 720*cda5da8dSAndroid Build Coastguard Worker """ 721*cda5da8dSAndroid Build Coastguard Worker # NOTE: this function is implemented in C (see _asynciomodule.c) 722*cda5da8dSAndroid Build Coastguard Worker loop = _get_running_loop() 723*cda5da8dSAndroid Build Coastguard Worker if loop is None: 724*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError('no running event loop') 725*cda5da8dSAndroid Build Coastguard Worker return loop 726*cda5da8dSAndroid Build Coastguard Worker 727*cda5da8dSAndroid Build Coastguard Worker 728*cda5da8dSAndroid Build Coastguard Workerdef _get_running_loop(): 729*cda5da8dSAndroid Build Coastguard Worker """Return the running event loop or None. 730*cda5da8dSAndroid Build Coastguard Worker 731*cda5da8dSAndroid Build Coastguard Worker This is a low-level function intended to be used by event loops. 732*cda5da8dSAndroid Build Coastguard Worker This function is thread-specific. 733*cda5da8dSAndroid Build Coastguard Worker """ 734*cda5da8dSAndroid Build Coastguard Worker # NOTE: this function is implemented in C (see _asynciomodule.c) 735*cda5da8dSAndroid Build Coastguard Worker running_loop, pid = _running_loop.loop_pid 736*cda5da8dSAndroid Build Coastguard Worker if running_loop is not None and pid == os.getpid(): 737*cda5da8dSAndroid Build Coastguard Worker return running_loop 738*cda5da8dSAndroid Build Coastguard Worker 739*cda5da8dSAndroid Build Coastguard Worker 740*cda5da8dSAndroid Build Coastguard Workerdef _set_running_loop(loop): 741*cda5da8dSAndroid Build Coastguard Worker """Set the running event loop. 742*cda5da8dSAndroid Build Coastguard Worker 743*cda5da8dSAndroid Build Coastguard Worker This is a low-level function intended to be used by event loops. 744*cda5da8dSAndroid Build Coastguard Worker This function is thread-specific. 745*cda5da8dSAndroid Build Coastguard Worker """ 746*cda5da8dSAndroid Build Coastguard Worker # NOTE: this function is implemented in C (see _asynciomodule.c) 747*cda5da8dSAndroid Build Coastguard Worker _running_loop.loop_pid = (loop, os.getpid()) 748*cda5da8dSAndroid Build Coastguard Worker 749*cda5da8dSAndroid Build Coastguard Worker 750*cda5da8dSAndroid Build Coastguard Workerdef _init_event_loop_policy(): 751*cda5da8dSAndroid Build Coastguard Worker global _event_loop_policy 752*cda5da8dSAndroid Build Coastguard Worker with _lock: 753*cda5da8dSAndroid Build Coastguard Worker if _event_loop_policy is None: # pragma: no branch 754*cda5da8dSAndroid Build Coastguard Worker from . import DefaultEventLoopPolicy 755*cda5da8dSAndroid Build Coastguard Worker _event_loop_policy = DefaultEventLoopPolicy() 756*cda5da8dSAndroid Build Coastguard Worker 757*cda5da8dSAndroid Build Coastguard Worker 758*cda5da8dSAndroid Build Coastguard Workerdef get_event_loop_policy(): 759*cda5da8dSAndroid Build Coastguard Worker """Get the current event loop policy.""" 760*cda5da8dSAndroid Build Coastguard Worker if _event_loop_policy is None: 761*cda5da8dSAndroid Build Coastguard Worker _init_event_loop_policy() 762*cda5da8dSAndroid Build Coastguard Worker return _event_loop_policy 763*cda5da8dSAndroid Build Coastguard Worker 764*cda5da8dSAndroid Build Coastguard Worker 765*cda5da8dSAndroid Build Coastguard Workerdef set_event_loop_policy(policy): 766*cda5da8dSAndroid Build Coastguard Worker """Set the current event loop policy. 767*cda5da8dSAndroid Build Coastguard Worker 768*cda5da8dSAndroid Build Coastguard Worker If policy is None, the default policy is restored.""" 769*cda5da8dSAndroid Build Coastguard Worker global _event_loop_policy 770*cda5da8dSAndroid Build Coastguard Worker if policy is not None and not isinstance(policy, AbstractEventLoopPolicy): 771*cda5da8dSAndroid Build Coastguard Worker raise TypeError(f"policy must be an instance of AbstractEventLoopPolicy or None, not '{type(policy).__name__}'") 772*cda5da8dSAndroid Build Coastguard Worker _event_loop_policy = policy 773*cda5da8dSAndroid Build Coastguard Worker 774*cda5da8dSAndroid Build Coastguard Worker 775*cda5da8dSAndroid Build Coastguard Workerdef get_event_loop(): 776*cda5da8dSAndroid Build Coastguard Worker """Return an asyncio event loop. 777*cda5da8dSAndroid Build Coastguard Worker 778*cda5da8dSAndroid Build Coastguard Worker When called from a coroutine or a callback (e.g. scheduled with call_soon 779*cda5da8dSAndroid Build Coastguard Worker or similar API), this function will always return the running event loop. 780*cda5da8dSAndroid Build Coastguard Worker 781*cda5da8dSAndroid Build Coastguard Worker If there is no running event loop set, the function will return 782*cda5da8dSAndroid Build Coastguard Worker the result of `get_event_loop_policy().get_event_loop()` call. 783*cda5da8dSAndroid Build Coastguard Worker """ 784*cda5da8dSAndroid Build Coastguard Worker # NOTE: this function is implemented in C (see _asynciomodule.c) 785*cda5da8dSAndroid Build Coastguard Worker return _py__get_event_loop() 786*cda5da8dSAndroid Build Coastguard Worker 787*cda5da8dSAndroid Build Coastguard Worker 788*cda5da8dSAndroid Build Coastguard Workerdef _get_event_loop(stacklevel=3): 789*cda5da8dSAndroid Build Coastguard Worker # This internal method is going away in Python 3.12, left here only for 790*cda5da8dSAndroid Build Coastguard Worker # backwards compatibility with 3.10.0 - 3.10.8 and 3.11.0. 791*cda5da8dSAndroid Build Coastguard Worker # Similarly, this method's C equivalent in _asyncio is going away as well. 792*cda5da8dSAndroid Build Coastguard Worker # See GH-99949 for more details. 793*cda5da8dSAndroid Build Coastguard Worker current_loop = _get_running_loop() 794*cda5da8dSAndroid Build Coastguard Worker if current_loop is not None: 795*cda5da8dSAndroid Build Coastguard Worker return current_loop 796*cda5da8dSAndroid Build Coastguard Worker return get_event_loop_policy().get_event_loop() 797*cda5da8dSAndroid Build Coastguard Worker 798*cda5da8dSAndroid Build Coastguard Worker 799*cda5da8dSAndroid Build Coastguard Workerdef set_event_loop(loop): 800*cda5da8dSAndroid Build Coastguard Worker """Equivalent to calling get_event_loop_policy().set_event_loop(loop).""" 801*cda5da8dSAndroid Build Coastguard Worker get_event_loop_policy().set_event_loop(loop) 802*cda5da8dSAndroid Build Coastguard Worker 803*cda5da8dSAndroid Build Coastguard Worker 804*cda5da8dSAndroid Build Coastguard Workerdef new_event_loop(): 805*cda5da8dSAndroid Build Coastguard Worker """Equivalent to calling get_event_loop_policy().new_event_loop().""" 806*cda5da8dSAndroid Build Coastguard Worker return get_event_loop_policy().new_event_loop() 807*cda5da8dSAndroid Build Coastguard Worker 808*cda5da8dSAndroid Build Coastguard Worker 809*cda5da8dSAndroid Build Coastguard Workerdef get_child_watcher(): 810*cda5da8dSAndroid Build Coastguard Worker """Equivalent to calling get_event_loop_policy().get_child_watcher().""" 811*cda5da8dSAndroid Build Coastguard Worker return get_event_loop_policy().get_child_watcher() 812*cda5da8dSAndroid Build Coastguard Worker 813*cda5da8dSAndroid Build Coastguard Worker 814*cda5da8dSAndroid Build Coastguard Workerdef set_child_watcher(watcher): 815*cda5da8dSAndroid Build Coastguard Worker """Equivalent to calling 816*cda5da8dSAndroid Build Coastguard Worker get_event_loop_policy().set_child_watcher(watcher).""" 817*cda5da8dSAndroid Build Coastguard Worker return get_event_loop_policy().set_child_watcher(watcher) 818*cda5da8dSAndroid Build Coastguard Worker 819*cda5da8dSAndroid Build Coastguard Worker 820*cda5da8dSAndroid Build Coastguard Worker# Alias pure-Python implementations for testing purposes. 821*cda5da8dSAndroid Build Coastguard Worker_py__get_running_loop = _get_running_loop 822*cda5da8dSAndroid Build Coastguard Worker_py__set_running_loop = _set_running_loop 823*cda5da8dSAndroid Build Coastguard Worker_py_get_running_loop = get_running_loop 824*cda5da8dSAndroid Build Coastguard Worker_py_get_event_loop = get_event_loop 825*cda5da8dSAndroid Build Coastguard Worker_py__get_event_loop = _get_event_loop 826*cda5da8dSAndroid Build Coastguard Worker 827*cda5da8dSAndroid Build Coastguard Worker 828*cda5da8dSAndroid Build Coastguard Workertry: 829*cda5da8dSAndroid Build Coastguard Worker # get_event_loop() is one of the most frequently called 830*cda5da8dSAndroid Build Coastguard Worker # functions in asyncio. Pure Python implementation is 831*cda5da8dSAndroid Build Coastguard Worker # about 4 times slower than C-accelerated. 832*cda5da8dSAndroid Build Coastguard Worker from _asyncio import (_get_running_loop, _set_running_loop, 833*cda5da8dSAndroid Build Coastguard Worker get_running_loop, get_event_loop, _get_event_loop) 834*cda5da8dSAndroid Build Coastguard Workerexcept ImportError: 835*cda5da8dSAndroid Build Coastguard Worker pass 836*cda5da8dSAndroid Build Coastguard Workerelse: 837*cda5da8dSAndroid Build Coastguard Worker # Alias C implementations for testing purposes. 838*cda5da8dSAndroid Build Coastguard Worker _c__get_running_loop = _get_running_loop 839*cda5da8dSAndroid Build Coastguard Worker _c__set_running_loop = _set_running_loop 840*cda5da8dSAndroid Build Coastguard Worker _c_get_running_loop = get_running_loop 841*cda5da8dSAndroid Build Coastguard Worker _c_get_event_loop = get_event_loop 842*cda5da8dSAndroid Build Coastguard Worker _c__get_event_loop = _get_event_loop 843