17db96d56Sopenharmony_ci"""Event loop and event loop policy.""" 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci__all__ = ( 47db96d56Sopenharmony_ci 'AbstractEventLoopPolicy', 57db96d56Sopenharmony_ci 'AbstractEventLoop', 'AbstractServer', 67db96d56Sopenharmony_ci 'Handle', 'TimerHandle', 77db96d56Sopenharmony_ci 'get_event_loop_policy', 'set_event_loop_policy', 87db96d56Sopenharmony_ci 'get_event_loop', 'set_event_loop', 'new_event_loop', 97db96d56Sopenharmony_ci 'get_child_watcher', 'set_child_watcher', 107db96d56Sopenharmony_ci '_set_running_loop', 'get_running_loop', 117db96d56Sopenharmony_ci '_get_running_loop', 127db96d56Sopenharmony_ci) 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ciimport contextvars 157db96d56Sopenharmony_ciimport os 167db96d56Sopenharmony_ciimport socket 177db96d56Sopenharmony_ciimport subprocess 187db96d56Sopenharmony_ciimport sys 197db96d56Sopenharmony_ciimport threading 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_cifrom . import format_helpers 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ciclass Handle: 257db96d56Sopenharmony_ci """Object returned by callback registration methods.""" 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci __slots__ = ('_callback', '_args', '_cancelled', '_loop', 287db96d56Sopenharmony_ci '_source_traceback', '_repr', '__weakref__', 297db96d56Sopenharmony_ci '_context') 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci def __init__(self, callback, args, loop, context=None): 327db96d56Sopenharmony_ci if context is None: 337db96d56Sopenharmony_ci context = contextvars.copy_context() 347db96d56Sopenharmony_ci self._context = context 357db96d56Sopenharmony_ci self._loop = loop 367db96d56Sopenharmony_ci self._callback = callback 377db96d56Sopenharmony_ci self._args = args 387db96d56Sopenharmony_ci self._cancelled = False 397db96d56Sopenharmony_ci self._repr = None 407db96d56Sopenharmony_ci if self._loop.get_debug(): 417db96d56Sopenharmony_ci self._source_traceback = format_helpers.extract_stack( 427db96d56Sopenharmony_ci sys._getframe(1)) 437db96d56Sopenharmony_ci else: 447db96d56Sopenharmony_ci self._source_traceback = None 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci def _repr_info(self): 477db96d56Sopenharmony_ci info = [self.__class__.__name__] 487db96d56Sopenharmony_ci if self._cancelled: 497db96d56Sopenharmony_ci info.append('cancelled') 507db96d56Sopenharmony_ci if self._callback is not None: 517db96d56Sopenharmony_ci info.append(format_helpers._format_callback_source( 527db96d56Sopenharmony_ci self._callback, self._args)) 537db96d56Sopenharmony_ci if self._source_traceback: 547db96d56Sopenharmony_ci frame = self._source_traceback[-1] 557db96d56Sopenharmony_ci info.append(f'created at {frame[0]}:{frame[1]}') 567db96d56Sopenharmony_ci return info 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci def __repr__(self): 597db96d56Sopenharmony_ci if self._repr is not None: 607db96d56Sopenharmony_ci return self._repr 617db96d56Sopenharmony_ci info = self._repr_info() 627db96d56Sopenharmony_ci return '<{}>'.format(' '.join(info)) 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci def cancel(self): 657db96d56Sopenharmony_ci if not self._cancelled: 667db96d56Sopenharmony_ci self._cancelled = True 677db96d56Sopenharmony_ci if self._loop.get_debug(): 687db96d56Sopenharmony_ci # Keep a representation in debug mode to keep callback and 697db96d56Sopenharmony_ci # parameters. For example, to log the warning 707db96d56Sopenharmony_ci # "Executing <Handle...> took 2.5 second" 717db96d56Sopenharmony_ci self._repr = repr(self) 727db96d56Sopenharmony_ci self._callback = None 737db96d56Sopenharmony_ci self._args = None 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci def cancelled(self): 767db96d56Sopenharmony_ci return self._cancelled 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci def _run(self): 797db96d56Sopenharmony_ci try: 807db96d56Sopenharmony_ci self._context.run(self._callback, *self._args) 817db96d56Sopenharmony_ci except (SystemExit, KeyboardInterrupt): 827db96d56Sopenharmony_ci raise 837db96d56Sopenharmony_ci except BaseException as exc: 847db96d56Sopenharmony_ci cb = format_helpers._format_callback_source( 857db96d56Sopenharmony_ci self._callback, self._args) 867db96d56Sopenharmony_ci msg = f'Exception in callback {cb}' 877db96d56Sopenharmony_ci context = { 887db96d56Sopenharmony_ci 'message': msg, 897db96d56Sopenharmony_ci 'exception': exc, 907db96d56Sopenharmony_ci 'handle': self, 917db96d56Sopenharmony_ci } 927db96d56Sopenharmony_ci if self._source_traceback: 937db96d56Sopenharmony_ci context['source_traceback'] = self._source_traceback 947db96d56Sopenharmony_ci self._loop.call_exception_handler(context) 957db96d56Sopenharmony_ci self = None # Needed to break cycles when an exception occurs. 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ciclass TimerHandle(Handle): 997db96d56Sopenharmony_ci """Object returned by timed callback registration methods.""" 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci __slots__ = ['_scheduled', '_when'] 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci def __init__(self, when, callback, args, loop, context=None): 1047db96d56Sopenharmony_ci super().__init__(callback, args, loop, context) 1057db96d56Sopenharmony_ci if self._source_traceback: 1067db96d56Sopenharmony_ci del self._source_traceback[-1] 1077db96d56Sopenharmony_ci self._when = when 1087db96d56Sopenharmony_ci self._scheduled = False 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci def _repr_info(self): 1117db96d56Sopenharmony_ci info = super()._repr_info() 1127db96d56Sopenharmony_ci pos = 2 if self._cancelled else 1 1137db96d56Sopenharmony_ci info.insert(pos, f'when={self._when}') 1147db96d56Sopenharmony_ci return info 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci def __hash__(self): 1177db96d56Sopenharmony_ci return hash(self._when) 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci def __lt__(self, other): 1207db96d56Sopenharmony_ci if isinstance(other, TimerHandle): 1217db96d56Sopenharmony_ci return self._when < other._when 1227db96d56Sopenharmony_ci return NotImplemented 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci def __le__(self, other): 1257db96d56Sopenharmony_ci if isinstance(other, TimerHandle): 1267db96d56Sopenharmony_ci return self._when < other._when or self.__eq__(other) 1277db96d56Sopenharmony_ci return NotImplemented 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci def __gt__(self, other): 1307db96d56Sopenharmony_ci if isinstance(other, TimerHandle): 1317db96d56Sopenharmony_ci return self._when > other._when 1327db96d56Sopenharmony_ci return NotImplemented 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci def __ge__(self, other): 1357db96d56Sopenharmony_ci if isinstance(other, TimerHandle): 1367db96d56Sopenharmony_ci return self._when > other._when or self.__eq__(other) 1377db96d56Sopenharmony_ci return NotImplemented 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci def __eq__(self, other): 1407db96d56Sopenharmony_ci if isinstance(other, TimerHandle): 1417db96d56Sopenharmony_ci return (self._when == other._when and 1427db96d56Sopenharmony_ci self._callback == other._callback and 1437db96d56Sopenharmony_ci self._args == other._args and 1447db96d56Sopenharmony_ci self._cancelled == other._cancelled) 1457db96d56Sopenharmony_ci return NotImplemented 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci def cancel(self): 1487db96d56Sopenharmony_ci if not self._cancelled: 1497db96d56Sopenharmony_ci self._loop._timer_handle_cancelled(self) 1507db96d56Sopenharmony_ci super().cancel() 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci def when(self): 1537db96d56Sopenharmony_ci """Return a scheduled callback time. 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci The time is an absolute timestamp, using the same time 1567db96d56Sopenharmony_ci reference as loop.time(). 1577db96d56Sopenharmony_ci """ 1587db96d56Sopenharmony_ci return self._when 1597db96d56Sopenharmony_ci 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ciclass AbstractServer: 1627db96d56Sopenharmony_ci """Abstract server returned by create_server().""" 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci def close(self): 1657db96d56Sopenharmony_ci """Stop serving. This leaves existing connections open.""" 1667db96d56Sopenharmony_ci raise NotImplementedError 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci def get_loop(self): 1697db96d56Sopenharmony_ci """Get the event loop the Server object is attached to.""" 1707db96d56Sopenharmony_ci raise NotImplementedError 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ci def is_serving(self): 1737db96d56Sopenharmony_ci """Return True if the server is accepting connections.""" 1747db96d56Sopenharmony_ci raise NotImplementedError 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci async def start_serving(self): 1777db96d56Sopenharmony_ci """Start accepting connections. 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci This method is idempotent, so it can be called when 1807db96d56Sopenharmony_ci the server is already being serving. 1817db96d56Sopenharmony_ci """ 1827db96d56Sopenharmony_ci raise NotImplementedError 1837db96d56Sopenharmony_ci 1847db96d56Sopenharmony_ci async def serve_forever(self): 1857db96d56Sopenharmony_ci """Start accepting connections until the coroutine is cancelled. 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci The server is closed when the coroutine is cancelled. 1887db96d56Sopenharmony_ci """ 1897db96d56Sopenharmony_ci raise NotImplementedError 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci async def wait_closed(self): 1927db96d56Sopenharmony_ci """Coroutine to wait until service is closed.""" 1937db96d56Sopenharmony_ci raise NotImplementedError 1947db96d56Sopenharmony_ci 1957db96d56Sopenharmony_ci async def __aenter__(self): 1967db96d56Sopenharmony_ci return self 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci async def __aexit__(self, *exc): 1997db96d56Sopenharmony_ci self.close() 2007db96d56Sopenharmony_ci await self.wait_closed() 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci 2037db96d56Sopenharmony_ciclass AbstractEventLoop: 2047db96d56Sopenharmony_ci """Abstract event loop.""" 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci # Running and stopping the event loop. 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci def run_forever(self): 2097db96d56Sopenharmony_ci """Run the event loop until stop() is called.""" 2107db96d56Sopenharmony_ci raise NotImplementedError 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci def run_until_complete(self, future): 2137db96d56Sopenharmony_ci """Run the event loop until a Future is done. 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci Return the Future's result, or raise its exception. 2167db96d56Sopenharmony_ci """ 2177db96d56Sopenharmony_ci raise NotImplementedError 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci def stop(self): 2207db96d56Sopenharmony_ci """Stop the event loop as soon as reasonable. 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci Exactly how soon that is may depend on the implementation, but 2237db96d56Sopenharmony_ci no more I/O callbacks should be scheduled. 2247db96d56Sopenharmony_ci """ 2257db96d56Sopenharmony_ci raise NotImplementedError 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci def is_running(self): 2287db96d56Sopenharmony_ci """Return whether the event loop is currently running.""" 2297db96d56Sopenharmony_ci raise NotImplementedError 2307db96d56Sopenharmony_ci 2317db96d56Sopenharmony_ci def is_closed(self): 2327db96d56Sopenharmony_ci """Returns True if the event loop was closed.""" 2337db96d56Sopenharmony_ci raise NotImplementedError 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci def close(self): 2367db96d56Sopenharmony_ci """Close the loop. 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci The loop should not be running. 2397db96d56Sopenharmony_ci 2407db96d56Sopenharmony_ci This is idempotent and irreversible. 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci No other methods should be called after this one. 2437db96d56Sopenharmony_ci """ 2447db96d56Sopenharmony_ci raise NotImplementedError 2457db96d56Sopenharmony_ci 2467db96d56Sopenharmony_ci async def shutdown_asyncgens(self): 2477db96d56Sopenharmony_ci """Shutdown all active asynchronous generators.""" 2487db96d56Sopenharmony_ci raise NotImplementedError 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ci async def shutdown_default_executor(self): 2517db96d56Sopenharmony_ci """Schedule the shutdown of the default executor.""" 2527db96d56Sopenharmony_ci raise NotImplementedError 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci # Methods scheduling callbacks. All these return Handles. 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci def _timer_handle_cancelled(self, handle): 2577db96d56Sopenharmony_ci """Notification that a TimerHandle has been cancelled.""" 2587db96d56Sopenharmony_ci raise NotImplementedError 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci def call_soon(self, callback, *args, context=None): 2617db96d56Sopenharmony_ci return self.call_later(0, callback, *args, context=context) 2627db96d56Sopenharmony_ci 2637db96d56Sopenharmony_ci def call_later(self, delay, callback, *args, context=None): 2647db96d56Sopenharmony_ci raise NotImplementedError 2657db96d56Sopenharmony_ci 2667db96d56Sopenharmony_ci def call_at(self, when, callback, *args, context=None): 2677db96d56Sopenharmony_ci raise NotImplementedError 2687db96d56Sopenharmony_ci 2697db96d56Sopenharmony_ci def time(self): 2707db96d56Sopenharmony_ci raise NotImplementedError 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci def create_future(self): 2737db96d56Sopenharmony_ci raise NotImplementedError 2747db96d56Sopenharmony_ci 2757db96d56Sopenharmony_ci # Method scheduling a coroutine object: create a task. 2767db96d56Sopenharmony_ci 2777db96d56Sopenharmony_ci def create_task(self, coro, *, name=None, context=None): 2787db96d56Sopenharmony_ci raise NotImplementedError 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci # Methods for interacting with threads. 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci def call_soon_threadsafe(self, callback, *args, context=None): 2837db96d56Sopenharmony_ci raise NotImplementedError 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci def run_in_executor(self, executor, func, *args): 2867db96d56Sopenharmony_ci raise NotImplementedError 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci def set_default_executor(self, executor): 2897db96d56Sopenharmony_ci raise NotImplementedError 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci # Network I/O methods returning Futures. 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci async def getaddrinfo(self, host, port, *, 2947db96d56Sopenharmony_ci family=0, type=0, proto=0, flags=0): 2957db96d56Sopenharmony_ci raise NotImplementedError 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci async def getnameinfo(self, sockaddr, flags=0): 2987db96d56Sopenharmony_ci raise NotImplementedError 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ci async def create_connection( 3017db96d56Sopenharmony_ci self, protocol_factory, host=None, port=None, 3027db96d56Sopenharmony_ci *, ssl=None, family=0, proto=0, 3037db96d56Sopenharmony_ci flags=0, sock=None, local_addr=None, 3047db96d56Sopenharmony_ci server_hostname=None, 3057db96d56Sopenharmony_ci ssl_handshake_timeout=None, 3067db96d56Sopenharmony_ci ssl_shutdown_timeout=None, 3077db96d56Sopenharmony_ci happy_eyeballs_delay=None, interleave=None): 3087db96d56Sopenharmony_ci raise NotImplementedError 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci async def create_server( 3117db96d56Sopenharmony_ci self, protocol_factory, host=None, port=None, 3127db96d56Sopenharmony_ci *, family=socket.AF_UNSPEC, 3137db96d56Sopenharmony_ci flags=socket.AI_PASSIVE, sock=None, backlog=100, 3147db96d56Sopenharmony_ci ssl=None, reuse_address=None, reuse_port=None, 3157db96d56Sopenharmony_ci ssl_handshake_timeout=None, 3167db96d56Sopenharmony_ci ssl_shutdown_timeout=None, 3177db96d56Sopenharmony_ci start_serving=True): 3187db96d56Sopenharmony_ci """A coroutine which creates a TCP server bound to host and port. 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_ci The return value is a Server object which can be used to stop 3217db96d56Sopenharmony_ci the service. 3227db96d56Sopenharmony_ci 3237db96d56Sopenharmony_ci If host is an empty string or None all interfaces are assumed 3247db96d56Sopenharmony_ci and a list of multiple sockets will be returned (most likely 3257db96d56Sopenharmony_ci one for IPv4 and another one for IPv6). The host parameter can also be 3267db96d56Sopenharmony_ci a sequence (e.g. list) of hosts to bind to. 3277db96d56Sopenharmony_ci 3287db96d56Sopenharmony_ci family can be set to either AF_INET or AF_INET6 to force the 3297db96d56Sopenharmony_ci socket to use IPv4 or IPv6. If not set it will be determined 3307db96d56Sopenharmony_ci from host (defaults to AF_UNSPEC). 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci flags is a bitmask for getaddrinfo(). 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci sock can optionally be specified in order to use a preexisting 3357db96d56Sopenharmony_ci socket object. 3367db96d56Sopenharmony_ci 3377db96d56Sopenharmony_ci backlog is the maximum number of queued connections passed to 3387db96d56Sopenharmony_ci listen() (defaults to 100). 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci ssl can be set to an SSLContext to enable SSL over the 3417db96d56Sopenharmony_ci accepted connections. 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ci reuse_address tells the kernel to reuse a local socket in 3447db96d56Sopenharmony_ci TIME_WAIT state, without waiting for its natural timeout to 3457db96d56Sopenharmony_ci expire. If not specified will automatically be set to True on 3467db96d56Sopenharmony_ci UNIX. 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci reuse_port tells the kernel to allow this endpoint to be bound to 3497db96d56Sopenharmony_ci the same port as other existing endpoints are bound to, so long as 3507db96d56Sopenharmony_ci they all set this flag when being created. This option is not 3517db96d56Sopenharmony_ci supported on Windows. 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_ci ssl_handshake_timeout is the time in seconds that an SSL server 3547db96d56Sopenharmony_ci will wait for completion of the SSL handshake before aborting the 3557db96d56Sopenharmony_ci connection. Default is 60s. 3567db96d56Sopenharmony_ci 3577db96d56Sopenharmony_ci ssl_shutdown_timeout is the time in seconds that an SSL server 3587db96d56Sopenharmony_ci will wait for completion of the SSL shutdown procedure 3597db96d56Sopenharmony_ci before aborting the connection. Default is 30s. 3607db96d56Sopenharmony_ci 3617db96d56Sopenharmony_ci start_serving set to True (default) causes the created server 3627db96d56Sopenharmony_ci to start accepting connections immediately. When set to False, 3637db96d56Sopenharmony_ci the user should await Server.start_serving() or Server.serve_forever() 3647db96d56Sopenharmony_ci to make the server to start accepting connections. 3657db96d56Sopenharmony_ci """ 3667db96d56Sopenharmony_ci raise NotImplementedError 3677db96d56Sopenharmony_ci 3687db96d56Sopenharmony_ci async def sendfile(self, transport, file, offset=0, count=None, 3697db96d56Sopenharmony_ci *, fallback=True): 3707db96d56Sopenharmony_ci """Send a file through a transport. 3717db96d56Sopenharmony_ci 3727db96d56Sopenharmony_ci Return an amount of sent bytes. 3737db96d56Sopenharmony_ci """ 3747db96d56Sopenharmony_ci raise NotImplementedError 3757db96d56Sopenharmony_ci 3767db96d56Sopenharmony_ci async def start_tls(self, transport, protocol, sslcontext, *, 3777db96d56Sopenharmony_ci server_side=False, 3787db96d56Sopenharmony_ci server_hostname=None, 3797db96d56Sopenharmony_ci ssl_handshake_timeout=None, 3807db96d56Sopenharmony_ci ssl_shutdown_timeout=None): 3817db96d56Sopenharmony_ci """Upgrade a transport to TLS. 3827db96d56Sopenharmony_ci 3837db96d56Sopenharmony_ci Return a new transport that *protocol* should start using 3847db96d56Sopenharmony_ci immediately. 3857db96d56Sopenharmony_ci """ 3867db96d56Sopenharmony_ci raise NotImplementedError 3877db96d56Sopenharmony_ci 3887db96d56Sopenharmony_ci async def create_unix_connection( 3897db96d56Sopenharmony_ci self, protocol_factory, path=None, *, 3907db96d56Sopenharmony_ci ssl=None, sock=None, 3917db96d56Sopenharmony_ci server_hostname=None, 3927db96d56Sopenharmony_ci ssl_handshake_timeout=None, 3937db96d56Sopenharmony_ci ssl_shutdown_timeout=None): 3947db96d56Sopenharmony_ci raise NotImplementedError 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci async def create_unix_server( 3977db96d56Sopenharmony_ci self, protocol_factory, path=None, *, 3987db96d56Sopenharmony_ci sock=None, backlog=100, ssl=None, 3997db96d56Sopenharmony_ci ssl_handshake_timeout=None, 4007db96d56Sopenharmony_ci ssl_shutdown_timeout=None, 4017db96d56Sopenharmony_ci start_serving=True): 4027db96d56Sopenharmony_ci """A coroutine which creates a UNIX Domain Socket server. 4037db96d56Sopenharmony_ci 4047db96d56Sopenharmony_ci The return value is a Server object, which can be used to stop 4057db96d56Sopenharmony_ci the service. 4067db96d56Sopenharmony_ci 4077db96d56Sopenharmony_ci path is a str, representing a file system path to bind the 4087db96d56Sopenharmony_ci server socket to. 4097db96d56Sopenharmony_ci 4107db96d56Sopenharmony_ci sock can optionally be specified in order to use a preexisting 4117db96d56Sopenharmony_ci socket object. 4127db96d56Sopenharmony_ci 4137db96d56Sopenharmony_ci backlog is the maximum number of queued connections passed to 4147db96d56Sopenharmony_ci listen() (defaults to 100). 4157db96d56Sopenharmony_ci 4167db96d56Sopenharmony_ci ssl can be set to an SSLContext to enable SSL over the 4177db96d56Sopenharmony_ci accepted connections. 4187db96d56Sopenharmony_ci 4197db96d56Sopenharmony_ci ssl_handshake_timeout is the time in seconds that an SSL server 4207db96d56Sopenharmony_ci will wait for the SSL handshake to complete (defaults to 60s). 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci ssl_shutdown_timeout is the time in seconds that an SSL server 4237db96d56Sopenharmony_ci will wait for the SSL shutdown to finish (defaults to 30s). 4247db96d56Sopenharmony_ci 4257db96d56Sopenharmony_ci start_serving set to True (default) causes the created server 4267db96d56Sopenharmony_ci to start accepting connections immediately. When set to False, 4277db96d56Sopenharmony_ci the user should await Server.start_serving() or Server.serve_forever() 4287db96d56Sopenharmony_ci to make the server to start accepting connections. 4297db96d56Sopenharmony_ci """ 4307db96d56Sopenharmony_ci raise NotImplementedError 4317db96d56Sopenharmony_ci 4327db96d56Sopenharmony_ci async def connect_accepted_socket( 4337db96d56Sopenharmony_ci self, protocol_factory, sock, 4347db96d56Sopenharmony_ci *, ssl=None, 4357db96d56Sopenharmony_ci ssl_handshake_timeout=None, 4367db96d56Sopenharmony_ci ssl_shutdown_timeout=None): 4377db96d56Sopenharmony_ci """Handle an accepted connection. 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci This is used by servers that accept connections outside of 4407db96d56Sopenharmony_ci asyncio, but use asyncio to handle connections. 4417db96d56Sopenharmony_ci 4427db96d56Sopenharmony_ci This method is a coroutine. When completed, the coroutine 4437db96d56Sopenharmony_ci returns a (transport, protocol) pair. 4447db96d56Sopenharmony_ci """ 4457db96d56Sopenharmony_ci raise NotImplementedError 4467db96d56Sopenharmony_ci 4477db96d56Sopenharmony_ci async def create_datagram_endpoint(self, protocol_factory, 4487db96d56Sopenharmony_ci local_addr=None, remote_addr=None, *, 4497db96d56Sopenharmony_ci family=0, proto=0, flags=0, 4507db96d56Sopenharmony_ci reuse_address=None, reuse_port=None, 4517db96d56Sopenharmony_ci allow_broadcast=None, sock=None): 4527db96d56Sopenharmony_ci """A coroutine which creates a datagram endpoint. 4537db96d56Sopenharmony_ci 4547db96d56Sopenharmony_ci This method will try to establish the endpoint in the background. 4557db96d56Sopenharmony_ci When successful, the coroutine returns a (transport, protocol) pair. 4567db96d56Sopenharmony_ci 4577db96d56Sopenharmony_ci protocol_factory must be a callable returning a protocol instance. 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ci socket family AF_INET, socket.AF_INET6 or socket.AF_UNIX depending on 4607db96d56Sopenharmony_ci host (or family if specified), socket type SOCK_DGRAM. 4617db96d56Sopenharmony_ci 4627db96d56Sopenharmony_ci reuse_address tells the kernel to reuse a local socket in 4637db96d56Sopenharmony_ci TIME_WAIT state, without waiting for its natural timeout to 4647db96d56Sopenharmony_ci expire. If not specified it will automatically be set to True on 4657db96d56Sopenharmony_ci UNIX. 4667db96d56Sopenharmony_ci 4677db96d56Sopenharmony_ci reuse_port tells the kernel to allow this endpoint to be bound to 4687db96d56Sopenharmony_ci the same port as other existing endpoints are bound to, so long as 4697db96d56Sopenharmony_ci they all set this flag when being created. This option is not 4707db96d56Sopenharmony_ci supported on Windows and some UNIX's. If the 4717db96d56Sopenharmony_ci :py:data:`~socket.SO_REUSEPORT` constant is not defined then this 4727db96d56Sopenharmony_ci capability is unsupported. 4737db96d56Sopenharmony_ci 4747db96d56Sopenharmony_ci allow_broadcast tells the kernel to allow this endpoint to send 4757db96d56Sopenharmony_ci messages to the broadcast address. 4767db96d56Sopenharmony_ci 4777db96d56Sopenharmony_ci sock can optionally be specified in order to use a preexisting 4787db96d56Sopenharmony_ci socket object. 4797db96d56Sopenharmony_ci """ 4807db96d56Sopenharmony_ci raise NotImplementedError 4817db96d56Sopenharmony_ci 4827db96d56Sopenharmony_ci # Pipes and subprocesses. 4837db96d56Sopenharmony_ci 4847db96d56Sopenharmony_ci async def connect_read_pipe(self, protocol_factory, pipe): 4857db96d56Sopenharmony_ci """Register read pipe in event loop. Set the pipe to non-blocking mode. 4867db96d56Sopenharmony_ci 4877db96d56Sopenharmony_ci protocol_factory should instantiate object with Protocol interface. 4887db96d56Sopenharmony_ci pipe is a file-like object. 4897db96d56Sopenharmony_ci Return pair (transport, protocol), where transport supports the 4907db96d56Sopenharmony_ci ReadTransport interface.""" 4917db96d56Sopenharmony_ci # The reason to accept file-like object instead of just file descriptor 4927db96d56Sopenharmony_ci # is: we need to own pipe and close it at transport finishing 4937db96d56Sopenharmony_ci # Can got complicated errors if pass f.fileno(), 4947db96d56Sopenharmony_ci # close fd in pipe transport then close f and vice versa. 4957db96d56Sopenharmony_ci raise NotImplementedError 4967db96d56Sopenharmony_ci 4977db96d56Sopenharmony_ci async def connect_write_pipe(self, protocol_factory, pipe): 4987db96d56Sopenharmony_ci """Register write pipe in event loop. 4997db96d56Sopenharmony_ci 5007db96d56Sopenharmony_ci protocol_factory should instantiate object with BaseProtocol interface. 5017db96d56Sopenharmony_ci Pipe is file-like object already switched to nonblocking. 5027db96d56Sopenharmony_ci Return pair (transport, protocol), where transport support 5037db96d56Sopenharmony_ci WriteTransport interface.""" 5047db96d56Sopenharmony_ci # The reason to accept file-like object instead of just file descriptor 5057db96d56Sopenharmony_ci # is: we need to own pipe and close it at transport finishing 5067db96d56Sopenharmony_ci # Can got complicated errors if pass f.fileno(), 5077db96d56Sopenharmony_ci # close fd in pipe transport then close f and vice versa. 5087db96d56Sopenharmony_ci raise NotImplementedError 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ci async def subprocess_shell(self, protocol_factory, cmd, *, 5117db96d56Sopenharmony_ci stdin=subprocess.PIPE, 5127db96d56Sopenharmony_ci stdout=subprocess.PIPE, 5137db96d56Sopenharmony_ci stderr=subprocess.PIPE, 5147db96d56Sopenharmony_ci **kwargs): 5157db96d56Sopenharmony_ci raise NotImplementedError 5167db96d56Sopenharmony_ci 5177db96d56Sopenharmony_ci async def subprocess_exec(self, protocol_factory, *args, 5187db96d56Sopenharmony_ci stdin=subprocess.PIPE, 5197db96d56Sopenharmony_ci stdout=subprocess.PIPE, 5207db96d56Sopenharmony_ci stderr=subprocess.PIPE, 5217db96d56Sopenharmony_ci **kwargs): 5227db96d56Sopenharmony_ci raise NotImplementedError 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci # Ready-based callback registration methods. 5257db96d56Sopenharmony_ci # The add_*() methods return None. 5267db96d56Sopenharmony_ci # The remove_*() methods return True if something was removed, 5277db96d56Sopenharmony_ci # False if there was nothing to delete. 5287db96d56Sopenharmony_ci 5297db96d56Sopenharmony_ci def add_reader(self, fd, callback, *args): 5307db96d56Sopenharmony_ci raise NotImplementedError 5317db96d56Sopenharmony_ci 5327db96d56Sopenharmony_ci def remove_reader(self, fd): 5337db96d56Sopenharmony_ci raise NotImplementedError 5347db96d56Sopenharmony_ci 5357db96d56Sopenharmony_ci def add_writer(self, fd, callback, *args): 5367db96d56Sopenharmony_ci raise NotImplementedError 5377db96d56Sopenharmony_ci 5387db96d56Sopenharmony_ci def remove_writer(self, fd): 5397db96d56Sopenharmony_ci raise NotImplementedError 5407db96d56Sopenharmony_ci 5417db96d56Sopenharmony_ci # Completion based I/O methods returning Futures. 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci async def sock_recv(self, sock, nbytes): 5447db96d56Sopenharmony_ci raise NotImplementedError 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci async def sock_recv_into(self, sock, buf): 5477db96d56Sopenharmony_ci raise NotImplementedError 5487db96d56Sopenharmony_ci 5497db96d56Sopenharmony_ci async def sock_recvfrom(self, sock, bufsize): 5507db96d56Sopenharmony_ci raise NotImplementedError 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci async def sock_recvfrom_into(self, sock, buf, nbytes=0): 5537db96d56Sopenharmony_ci raise NotImplementedError 5547db96d56Sopenharmony_ci 5557db96d56Sopenharmony_ci async def sock_sendall(self, sock, data): 5567db96d56Sopenharmony_ci raise NotImplementedError 5577db96d56Sopenharmony_ci 5587db96d56Sopenharmony_ci async def sock_sendto(self, sock, data, address): 5597db96d56Sopenharmony_ci raise NotImplementedError 5607db96d56Sopenharmony_ci 5617db96d56Sopenharmony_ci async def sock_connect(self, sock, address): 5627db96d56Sopenharmony_ci raise NotImplementedError 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci async def sock_accept(self, sock): 5657db96d56Sopenharmony_ci raise NotImplementedError 5667db96d56Sopenharmony_ci 5677db96d56Sopenharmony_ci async def sock_sendfile(self, sock, file, offset=0, count=None, 5687db96d56Sopenharmony_ci *, fallback=None): 5697db96d56Sopenharmony_ci raise NotImplementedError 5707db96d56Sopenharmony_ci 5717db96d56Sopenharmony_ci # Signal handling. 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_ci def add_signal_handler(self, sig, callback, *args): 5747db96d56Sopenharmony_ci raise NotImplementedError 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_ci def remove_signal_handler(self, sig): 5777db96d56Sopenharmony_ci raise NotImplementedError 5787db96d56Sopenharmony_ci 5797db96d56Sopenharmony_ci # Task factory. 5807db96d56Sopenharmony_ci 5817db96d56Sopenharmony_ci def set_task_factory(self, factory): 5827db96d56Sopenharmony_ci raise NotImplementedError 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ci def get_task_factory(self): 5857db96d56Sopenharmony_ci raise NotImplementedError 5867db96d56Sopenharmony_ci 5877db96d56Sopenharmony_ci # Error handlers. 5887db96d56Sopenharmony_ci 5897db96d56Sopenharmony_ci def get_exception_handler(self): 5907db96d56Sopenharmony_ci raise NotImplementedError 5917db96d56Sopenharmony_ci 5927db96d56Sopenharmony_ci def set_exception_handler(self, handler): 5937db96d56Sopenharmony_ci raise NotImplementedError 5947db96d56Sopenharmony_ci 5957db96d56Sopenharmony_ci def default_exception_handler(self, context): 5967db96d56Sopenharmony_ci raise NotImplementedError 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci def call_exception_handler(self, context): 5997db96d56Sopenharmony_ci raise NotImplementedError 6007db96d56Sopenharmony_ci 6017db96d56Sopenharmony_ci # Debug flag management. 6027db96d56Sopenharmony_ci 6037db96d56Sopenharmony_ci def get_debug(self): 6047db96d56Sopenharmony_ci raise NotImplementedError 6057db96d56Sopenharmony_ci 6067db96d56Sopenharmony_ci def set_debug(self, enabled): 6077db96d56Sopenharmony_ci raise NotImplementedError 6087db96d56Sopenharmony_ci 6097db96d56Sopenharmony_ci 6107db96d56Sopenharmony_ciclass AbstractEventLoopPolicy: 6117db96d56Sopenharmony_ci """Abstract policy for accessing the event loop.""" 6127db96d56Sopenharmony_ci 6137db96d56Sopenharmony_ci def get_event_loop(self): 6147db96d56Sopenharmony_ci """Get the event loop for the current context. 6157db96d56Sopenharmony_ci 6167db96d56Sopenharmony_ci Returns an event loop object implementing the BaseEventLoop interface, 6177db96d56Sopenharmony_ci or raises an exception in case no event loop has been set for the 6187db96d56Sopenharmony_ci current context and the current policy does not specify to create one. 6197db96d56Sopenharmony_ci 6207db96d56Sopenharmony_ci It should never return None.""" 6217db96d56Sopenharmony_ci raise NotImplementedError 6227db96d56Sopenharmony_ci 6237db96d56Sopenharmony_ci def set_event_loop(self, loop): 6247db96d56Sopenharmony_ci """Set the event loop for the current context to loop.""" 6257db96d56Sopenharmony_ci raise NotImplementedError 6267db96d56Sopenharmony_ci 6277db96d56Sopenharmony_ci def new_event_loop(self): 6287db96d56Sopenharmony_ci """Create and return a new event loop object according to this 6297db96d56Sopenharmony_ci policy's rules. If there's need to set this loop as the event loop for 6307db96d56Sopenharmony_ci the current context, set_event_loop must be called explicitly.""" 6317db96d56Sopenharmony_ci raise NotImplementedError 6327db96d56Sopenharmony_ci 6337db96d56Sopenharmony_ci # Child processes handling (Unix only). 6347db96d56Sopenharmony_ci 6357db96d56Sopenharmony_ci def get_child_watcher(self): 6367db96d56Sopenharmony_ci "Get the watcher for child processes." 6377db96d56Sopenharmony_ci raise NotImplementedError 6387db96d56Sopenharmony_ci 6397db96d56Sopenharmony_ci def set_child_watcher(self, watcher): 6407db96d56Sopenharmony_ci """Set the watcher for child processes.""" 6417db96d56Sopenharmony_ci raise NotImplementedError 6427db96d56Sopenharmony_ci 6437db96d56Sopenharmony_ci 6447db96d56Sopenharmony_ciclass BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy): 6457db96d56Sopenharmony_ci """Default policy implementation for accessing the event loop. 6467db96d56Sopenharmony_ci 6477db96d56Sopenharmony_ci In this policy, each thread has its own event loop. However, we 6487db96d56Sopenharmony_ci only automatically create an event loop by default for the main 6497db96d56Sopenharmony_ci thread; other threads by default have no event loop. 6507db96d56Sopenharmony_ci 6517db96d56Sopenharmony_ci Other policies may have different rules (e.g. a single global 6527db96d56Sopenharmony_ci event loop, or automatically creating an event loop per thread, or 6537db96d56Sopenharmony_ci using some other notion of context to which an event loop is 6547db96d56Sopenharmony_ci associated). 6557db96d56Sopenharmony_ci """ 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci _loop_factory = None 6587db96d56Sopenharmony_ci 6597db96d56Sopenharmony_ci class _Local(threading.local): 6607db96d56Sopenharmony_ci _loop = None 6617db96d56Sopenharmony_ci _set_called = False 6627db96d56Sopenharmony_ci 6637db96d56Sopenharmony_ci def __init__(self): 6647db96d56Sopenharmony_ci self._local = self._Local() 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ci def get_event_loop(self): 6677db96d56Sopenharmony_ci """Get the event loop for the current context. 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_ci Returns an instance of EventLoop or raises an exception. 6707db96d56Sopenharmony_ci """ 6717db96d56Sopenharmony_ci if (self._local._loop is None and 6727db96d56Sopenharmony_ci not self._local._set_called and 6737db96d56Sopenharmony_ci threading.current_thread() is threading.main_thread()): 6747db96d56Sopenharmony_ci self.set_event_loop(self.new_event_loop()) 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci if self._local._loop is None: 6777db96d56Sopenharmony_ci raise RuntimeError('There is no current event loop in thread %r.' 6787db96d56Sopenharmony_ci % threading.current_thread().name) 6797db96d56Sopenharmony_ci 6807db96d56Sopenharmony_ci return self._local._loop 6817db96d56Sopenharmony_ci 6827db96d56Sopenharmony_ci def set_event_loop(self, loop): 6837db96d56Sopenharmony_ci """Set the event loop.""" 6847db96d56Sopenharmony_ci self._local._set_called = True 6857db96d56Sopenharmony_ci if loop is not None and not isinstance(loop, AbstractEventLoop): 6867db96d56Sopenharmony_ci raise TypeError(f"loop must be an instance of AbstractEventLoop or None, not '{type(loop).__name__}'") 6877db96d56Sopenharmony_ci self._local._loop = loop 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci def new_event_loop(self): 6907db96d56Sopenharmony_ci """Create a new event loop. 6917db96d56Sopenharmony_ci 6927db96d56Sopenharmony_ci You must call set_event_loop() to make this the current event 6937db96d56Sopenharmony_ci loop. 6947db96d56Sopenharmony_ci """ 6957db96d56Sopenharmony_ci return self._loop_factory() 6967db96d56Sopenharmony_ci 6977db96d56Sopenharmony_ci 6987db96d56Sopenharmony_ci# Event loop policy. The policy itself is always global, even if the 6997db96d56Sopenharmony_ci# policy's rules say that there is an event loop per thread (or other 7007db96d56Sopenharmony_ci# notion of context). The default policy is installed by the first 7017db96d56Sopenharmony_ci# call to get_event_loop_policy(). 7027db96d56Sopenharmony_ci_event_loop_policy = None 7037db96d56Sopenharmony_ci 7047db96d56Sopenharmony_ci# Lock for protecting the on-the-fly creation of the event loop policy. 7057db96d56Sopenharmony_ci_lock = threading.Lock() 7067db96d56Sopenharmony_ci 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ci# A TLS for the running event loop, used by _get_running_loop. 7097db96d56Sopenharmony_ciclass _RunningLoop(threading.local): 7107db96d56Sopenharmony_ci loop_pid = (None, None) 7117db96d56Sopenharmony_ci 7127db96d56Sopenharmony_ci 7137db96d56Sopenharmony_ci_running_loop = _RunningLoop() 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_cidef get_running_loop(): 7177db96d56Sopenharmony_ci """Return the running event loop. Raise a RuntimeError if there is none. 7187db96d56Sopenharmony_ci 7197db96d56Sopenharmony_ci This function is thread-specific. 7207db96d56Sopenharmony_ci """ 7217db96d56Sopenharmony_ci # NOTE: this function is implemented in C (see _asynciomodule.c) 7227db96d56Sopenharmony_ci loop = _get_running_loop() 7237db96d56Sopenharmony_ci if loop is None: 7247db96d56Sopenharmony_ci raise RuntimeError('no running event loop') 7257db96d56Sopenharmony_ci return loop 7267db96d56Sopenharmony_ci 7277db96d56Sopenharmony_ci 7287db96d56Sopenharmony_cidef _get_running_loop(): 7297db96d56Sopenharmony_ci """Return the running event loop or None. 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_ci This is a low-level function intended to be used by event loops. 7327db96d56Sopenharmony_ci This function is thread-specific. 7337db96d56Sopenharmony_ci """ 7347db96d56Sopenharmony_ci # NOTE: this function is implemented in C (see _asynciomodule.c) 7357db96d56Sopenharmony_ci running_loop, pid = _running_loop.loop_pid 7367db96d56Sopenharmony_ci if running_loop is not None and pid == os.getpid(): 7377db96d56Sopenharmony_ci return running_loop 7387db96d56Sopenharmony_ci 7397db96d56Sopenharmony_ci 7407db96d56Sopenharmony_cidef _set_running_loop(loop): 7417db96d56Sopenharmony_ci """Set the running event loop. 7427db96d56Sopenharmony_ci 7437db96d56Sopenharmony_ci This is a low-level function intended to be used by event loops. 7447db96d56Sopenharmony_ci This function is thread-specific. 7457db96d56Sopenharmony_ci """ 7467db96d56Sopenharmony_ci # NOTE: this function is implemented in C (see _asynciomodule.c) 7477db96d56Sopenharmony_ci _running_loop.loop_pid = (loop, os.getpid()) 7487db96d56Sopenharmony_ci 7497db96d56Sopenharmony_ci 7507db96d56Sopenharmony_cidef _init_event_loop_policy(): 7517db96d56Sopenharmony_ci global _event_loop_policy 7527db96d56Sopenharmony_ci with _lock: 7537db96d56Sopenharmony_ci if _event_loop_policy is None: # pragma: no branch 7547db96d56Sopenharmony_ci from . import DefaultEventLoopPolicy 7557db96d56Sopenharmony_ci _event_loop_policy = DefaultEventLoopPolicy() 7567db96d56Sopenharmony_ci 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_cidef get_event_loop_policy(): 7597db96d56Sopenharmony_ci """Get the current event loop policy.""" 7607db96d56Sopenharmony_ci if _event_loop_policy is None: 7617db96d56Sopenharmony_ci _init_event_loop_policy() 7627db96d56Sopenharmony_ci return _event_loop_policy 7637db96d56Sopenharmony_ci 7647db96d56Sopenharmony_ci 7657db96d56Sopenharmony_cidef set_event_loop_policy(policy): 7667db96d56Sopenharmony_ci """Set the current event loop policy. 7677db96d56Sopenharmony_ci 7687db96d56Sopenharmony_ci If policy is None, the default policy is restored.""" 7697db96d56Sopenharmony_ci global _event_loop_policy 7707db96d56Sopenharmony_ci if policy is not None and not isinstance(policy, AbstractEventLoopPolicy): 7717db96d56Sopenharmony_ci raise TypeError(f"policy must be an instance of AbstractEventLoopPolicy or None, not '{type(policy).__name__}'") 7727db96d56Sopenharmony_ci _event_loop_policy = policy 7737db96d56Sopenharmony_ci 7747db96d56Sopenharmony_ci 7757db96d56Sopenharmony_cidef get_event_loop(): 7767db96d56Sopenharmony_ci """Return an asyncio event loop. 7777db96d56Sopenharmony_ci 7787db96d56Sopenharmony_ci When called from a coroutine or a callback (e.g. scheduled with call_soon 7797db96d56Sopenharmony_ci or similar API), this function will always return the running event loop. 7807db96d56Sopenharmony_ci 7817db96d56Sopenharmony_ci If there is no running event loop set, the function will return 7827db96d56Sopenharmony_ci the result of `get_event_loop_policy().get_event_loop()` call. 7837db96d56Sopenharmony_ci """ 7847db96d56Sopenharmony_ci # NOTE: this function is implemented in C (see _asynciomodule.c) 7857db96d56Sopenharmony_ci return _py__get_event_loop() 7867db96d56Sopenharmony_ci 7877db96d56Sopenharmony_ci 7887db96d56Sopenharmony_cidef _get_event_loop(stacklevel=3): 7897db96d56Sopenharmony_ci # This internal method is going away in Python 3.12, left here only for 7907db96d56Sopenharmony_ci # backwards compatibility with 3.10.0 - 3.10.8 and 3.11.0. 7917db96d56Sopenharmony_ci # Similarly, this method's C equivalent in _asyncio is going away as well. 7927db96d56Sopenharmony_ci # See GH-99949 for more details. 7937db96d56Sopenharmony_ci current_loop = _get_running_loop() 7947db96d56Sopenharmony_ci if current_loop is not None: 7957db96d56Sopenharmony_ci return current_loop 7967db96d56Sopenharmony_ci return get_event_loop_policy().get_event_loop() 7977db96d56Sopenharmony_ci 7987db96d56Sopenharmony_ci 7997db96d56Sopenharmony_cidef set_event_loop(loop): 8007db96d56Sopenharmony_ci """Equivalent to calling get_event_loop_policy().set_event_loop(loop).""" 8017db96d56Sopenharmony_ci get_event_loop_policy().set_event_loop(loop) 8027db96d56Sopenharmony_ci 8037db96d56Sopenharmony_ci 8047db96d56Sopenharmony_cidef new_event_loop(): 8057db96d56Sopenharmony_ci """Equivalent to calling get_event_loop_policy().new_event_loop().""" 8067db96d56Sopenharmony_ci return get_event_loop_policy().new_event_loop() 8077db96d56Sopenharmony_ci 8087db96d56Sopenharmony_ci 8097db96d56Sopenharmony_cidef get_child_watcher(): 8107db96d56Sopenharmony_ci """Equivalent to calling get_event_loop_policy().get_child_watcher().""" 8117db96d56Sopenharmony_ci return get_event_loop_policy().get_child_watcher() 8127db96d56Sopenharmony_ci 8137db96d56Sopenharmony_ci 8147db96d56Sopenharmony_cidef set_child_watcher(watcher): 8157db96d56Sopenharmony_ci """Equivalent to calling 8167db96d56Sopenharmony_ci get_event_loop_policy().set_child_watcher(watcher).""" 8177db96d56Sopenharmony_ci return get_event_loop_policy().set_child_watcher(watcher) 8187db96d56Sopenharmony_ci 8197db96d56Sopenharmony_ci 8207db96d56Sopenharmony_ci# Alias pure-Python implementations for testing purposes. 8217db96d56Sopenharmony_ci_py__get_running_loop = _get_running_loop 8227db96d56Sopenharmony_ci_py__set_running_loop = _set_running_loop 8237db96d56Sopenharmony_ci_py_get_running_loop = get_running_loop 8247db96d56Sopenharmony_ci_py_get_event_loop = get_event_loop 8257db96d56Sopenharmony_ci_py__get_event_loop = _get_event_loop 8267db96d56Sopenharmony_ci 8277db96d56Sopenharmony_ci 8287db96d56Sopenharmony_citry: 8297db96d56Sopenharmony_ci # get_event_loop() is one of the most frequently called 8307db96d56Sopenharmony_ci # functions in asyncio. Pure Python implementation is 8317db96d56Sopenharmony_ci # about 4 times slower than C-accelerated. 8327db96d56Sopenharmony_ci from _asyncio import (_get_running_loop, _set_running_loop, 8337db96d56Sopenharmony_ci get_running_loop, get_event_loop, _get_event_loop) 8347db96d56Sopenharmony_ciexcept ImportError: 8357db96d56Sopenharmony_ci pass 8367db96d56Sopenharmony_cielse: 8377db96d56Sopenharmony_ci # Alias C implementations for testing purposes. 8387db96d56Sopenharmony_ci _c__get_running_loop = _get_running_loop 8397db96d56Sopenharmony_ci _c__set_running_loop = _set_running_loop 8407db96d56Sopenharmony_ci _c_get_running_loop = get_running_loop 8417db96d56Sopenharmony_ci _c_get_event_loop = get_event_loop 8427db96d56Sopenharmony_ci _c__get_event_loop = _get_event_loop 843