17db96d56Sopenharmony_ci.. currentmodule:: asyncio
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. _asyncio-event-loop:
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci==========
77db96d56Sopenharmony_ciEvent Loop
87db96d56Sopenharmony_ci==========
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/asyncio/events.py`,
117db96d56Sopenharmony_ci:source:`Lib/asyncio/base_events.py`
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci------------------------------------
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci.. rubric:: Preface
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ciThe event loop is the core of every asyncio application.
187db96d56Sopenharmony_ciEvent loops run asynchronous tasks and callbacks, perform network
197db96d56Sopenharmony_ciIO operations, and run subprocesses.
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ciApplication developers should typically use the high-level asyncio functions,
227db96d56Sopenharmony_cisuch as :func:`asyncio.run`, and should rarely need to reference the loop
237db96d56Sopenharmony_ciobject or call its methods.  This section is intended mostly for authors
247db96d56Sopenharmony_ciof lower-level code, libraries, and frameworks, who need finer control over
257db96d56Sopenharmony_cithe event loop behavior.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci.. rubric:: Obtaining the Event Loop
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ciThe following low-level functions can be used to get, set, or create
307db96d56Sopenharmony_cian event loop:
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci.. function:: get_running_loop()
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci   Return the running event loop in the current OS thread.
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci   Raise a :exc:`RuntimeError` if there is no running event loop.
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci   This function can only be called from a coroutine or a callback.
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci   .. versionadded:: 3.7
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci.. function:: get_event_loop()
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci   Get the current event loop.
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci   When called from a coroutine or a callback (e.g. scheduled with
477db96d56Sopenharmony_ci   call_soon or similar API), this function will always return the
487db96d56Sopenharmony_ci   running event loop.
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci   If there is no running event loop set, the function will return
517db96d56Sopenharmony_ci   the result of the ``get_event_loop_policy().get_event_loop()`` call.
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci   Because this function has rather complex behavior (especially
547db96d56Sopenharmony_ci   when custom event loop policies are in use), using the
557db96d56Sopenharmony_ci   :func:`get_running_loop` function is preferred to :func:`get_event_loop`
567db96d56Sopenharmony_ci   in coroutines and callbacks.
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci   As noted above, consider using the higher-level :func:`asyncio.run` function,
597db96d56Sopenharmony_ci   instead of using these lower level functions to manually create and close an
607db96d56Sopenharmony_ci   event loop.
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci   .. note::
637db96d56Sopenharmony_ci      In Python versions 3.10.0--3.10.8 and 3.11.0 this function
647db96d56Sopenharmony_ci      (and other functions which use it implicitly) emitted a
657db96d56Sopenharmony_ci      :exc:`DeprecationWarning` if there was no running event loop, even if
667db96d56Sopenharmony_ci      the current loop was set on the policy.
677db96d56Sopenharmony_ci      In Python versions 3.10.9, 3.11.1 and 3.12 they emit a
687db96d56Sopenharmony_ci      :exc:`DeprecationWarning` if there is no running event loop and no
697db96d56Sopenharmony_ci      current loop is set.
707db96d56Sopenharmony_ci      In some future Python release this will become an error.
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci.. function:: set_event_loop(loop)
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci   Set *loop* as the current event loop for the current OS thread.
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci.. function:: new_event_loop()
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci   Create and return a new event loop object.
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ciNote that the behaviour of :func:`get_event_loop`, :func:`set_event_loop`,
817db96d56Sopenharmony_ciand :func:`new_event_loop` functions can be altered by
827db96d56Sopenharmony_ci:ref:`setting a custom event loop policy <asyncio-policies>`.
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci.. rubric:: Contents
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ciThis documentation page contains the following sections:
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci* The `Event Loop Methods`_ section is the reference documentation of
907db96d56Sopenharmony_ci  the event loop APIs;
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci* The `Callback Handles`_ section documents the :class:`Handle` and
937db96d56Sopenharmony_ci  :class:`TimerHandle` instances which are returned from scheduling
947db96d56Sopenharmony_ci  methods such as :meth:`loop.call_soon` and :meth:`loop.call_later`;
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci* The `Server Objects`_ section documents types returned from
977db96d56Sopenharmony_ci  event loop methods like :meth:`loop.create_server`;
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci* The `Event Loop Implementations`_ section documents the
1007db96d56Sopenharmony_ci  :class:`SelectorEventLoop` and :class:`ProactorEventLoop` classes;
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci* The `Examples`_ section showcases how to work with some event
1037db96d56Sopenharmony_ci  loop APIs.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci.. _asyncio-event-loop-methods:
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ciEvent Loop Methods
1097db96d56Sopenharmony_ci==================
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ciEvent loops have **low-level** APIs for the following:
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci.. contents::
1147db96d56Sopenharmony_ci   :depth: 1
1157db96d56Sopenharmony_ci   :local:
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ciRunning and stopping the loop
1197db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci.. method:: loop.run_until_complete(future)
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci   Run until the *future* (an instance of :class:`Future`) has
1247db96d56Sopenharmony_ci   completed.
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci   If the argument is a :ref:`coroutine object <coroutine>` it
1277db96d56Sopenharmony_ci   is implicitly scheduled to run as a :class:`asyncio.Task`.
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci   Return the Future's result or raise its exception.
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci.. method:: loop.run_forever()
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci   Run the event loop until :meth:`stop` is called.
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci   If :meth:`stop` is called before :meth:`run_forever()` is called,
1367db96d56Sopenharmony_ci   the loop will poll the I/O selector once with a timeout of zero,
1377db96d56Sopenharmony_ci   run all callbacks scheduled in response to I/O events (and
1387db96d56Sopenharmony_ci   those that were already scheduled), and then exit.
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci   If :meth:`stop` is called while :meth:`run_forever` is running,
1417db96d56Sopenharmony_ci   the loop will run the current batch of callbacks and then exit.
1427db96d56Sopenharmony_ci   Note that new callbacks scheduled by callbacks will not run in this
1437db96d56Sopenharmony_ci   case; instead, they will run the next time :meth:`run_forever` or
1447db96d56Sopenharmony_ci   :meth:`run_until_complete` is called.
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci.. method:: loop.stop()
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci   Stop the event loop.
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci.. method:: loop.is_running()
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci   Return ``True`` if the event loop is currently running.
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci.. method:: loop.is_closed()
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci   Return ``True`` if the event loop was closed.
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci.. method:: loop.close()
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci   Close the event loop.
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci   The loop must not be running when this function is called.
1637db96d56Sopenharmony_ci   Any pending callbacks will be discarded.
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci   This method clears all queues and shuts down the executor, but does
1667db96d56Sopenharmony_ci   not wait for the executor to finish.
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci   This method is idempotent and irreversible.  No other methods
1697db96d56Sopenharmony_ci   should be called after the event loop is closed.
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci.. coroutinemethod:: loop.shutdown_asyncgens()
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci   Schedule all currently open :term:`asynchronous generator` objects to
1747db96d56Sopenharmony_ci   close with an :meth:`~agen.aclose()` call.  After calling this method,
1757db96d56Sopenharmony_ci   the event loop will issue a warning if a new asynchronous generator
1767db96d56Sopenharmony_ci   is iterated. This should be used to reliably finalize all scheduled
1777db96d56Sopenharmony_ci   asynchronous generators.
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci   Note that there is no need to call this function when
1807db96d56Sopenharmony_ci   :func:`asyncio.run` is used.
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci   Example::
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci    try:
1857db96d56Sopenharmony_ci        loop.run_forever()
1867db96d56Sopenharmony_ci    finally:
1877db96d56Sopenharmony_ci        loop.run_until_complete(loop.shutdown_asyncgens())
1887db96d56Sopenharmony_ci        loop.close()
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci   .. versionadded:: 3.6
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci.. coroutinemethod:: loop.shutdown_default_executor()
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci   Schedule the closure of the default executor and wait for it to join all of
1957db96d56Sopenharmony_ci   the threads in the :class:`~concurrent.futures.ThreadPoolExecutor`.
1967db96d56Sopenharmony_ci   Once this method has been called,
1977db96d56Sopenharmony_ci   using the default executor with :meth:`loop.run_in_executor`
1987db96d56Sopenharmony_ci   will raise a :exc:`RuntimeError`.
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci   .. note::
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci      Do not call this method when using :func:`asyncio.run`,
2037db96d56Sopenharmony_ci      as the latter handles default executor shutdown automatically.
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci   .. versionadded:: 3.9
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ciScheduling callbacks
2097db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci.. method:: loop.call_soon(callback, *args, context=None)
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci   Schedule the *callback* :term:`callback` to be called with
2147db96d56Sopenharmony_ci   *args* arguments at the next iteration of the event loop.
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci   Return an instance of :class:`asyncio.Handle`,
2177db96d56Sopenharmony_ci   which can be used later to cancel the callback.
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci   Callbacks are called in the order in which they are registered.
2207db96d56Sopenharmony_ci   Each callback will be called exactly once.
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci   The optional keyword-only *context* argument specifies a
2237db96d56Sopenharmony_ci   custom :class:`contextvars.Context` for the *callback* to run in.
2247db96d56Sopenharmony_ci   Callbacks use the current context when no *context* is provided.
2257db96d56Sopenharmony_ci
2267db96d56Sopenharmony_ci   Unlike :meth:`call_soon_threadsafe`, this method is not thread-safe.
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci.. method:: loop.call_soon_threadsafe(callback, *args, context=None)
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   A thread-safe variant of :meth:`call_soon`. When scheduling callbacks from
2317db96d56Sopenharmony_ci   another thread, this function *must* be used, since :meth:`call_soon` is not
2327db96d56Sopenharmony_ci   thread-safe.
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci   Raises :exc:`RuntimeError` if called on a loop that's been closed.
2357db96d56Sopenharmony_ci   This can happen on a secondary thread when the main application is
2367db96d56Sopenharmony_ci   shutting down.
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci   See the :ref:`concurrency and multithreading <asyncio-multithreading>`
2397db96d56Sopenharmony_ci   section of the documentation.
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci.. versionchanged:: 3.7
2427db96d56Sopenharmony_ci   The *context* keyword-only parameter was added. See :pep:`567`
2437db96d56Sopenharmony_ci   for more details.
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci.. _asyncio-pass-keywords:
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci.. note::
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci   Most :mod:`asyncio` scheduling functions don't allow passing
2507db96d56Sopenharmony_ci   keyword arguments.  To do that, use :func:`functools.partial`::
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci      # will schedule "print("Hello", flush=True)"
2537db96d56Sopenharmony_ci      loop.call_soon(
2547db96d56Sopenharmony_ci          functools.partial(print, "Hello", flush=True))
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci   Using partial objects is usually more convenient than using lambdas,
2577db96d56Sopenharmony_ci   as asyncio can render partial objects better in debug and error
2587db96d56Sopenharmony_ci   messages.
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci.. _asyncio-delayed-calls:
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ciScheduling delayed callbacks
2647db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ciEvent loop provides mechanisms to schedule callback functions
2677db96d56Sopenharmony_cito be called at some point in the future.  Event loop uses monotonic
2687db96d56Sopenharmony_ciclocks to track time.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci.. method:: loop.call_later(delay, callback, *args, context=None)
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci   Schedule *callback* to be called after the given *delay*
2747db96d56Sopenharmony_ci   number of seconds (can be either an int or a float).
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci   An instance of :class:`asyncio.TimerHandle` is returned which can
2777db96d56Sopenharmony_ci   be used to cancel the callback.
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci   *callback* will be called exactly once.  If two callbacks are
2807db96d56Sopenharmony_ci   scheduled for exactly the same time, the order in which they
2817db96d56Sopenharmony_ci   are called is undefined.
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   The optional positional *args* will be passed to the callback when
2847db96d56Sopenharmony_ci   it is called. If you want the callback to be called with keyword
2857db96d56Sopenharmony_ci   arguments use :func:`functools.partial`.
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci   An optional keyword-only *context* argument allows specifying a
2887db96d56Sopenharmony_ci   custom :class:`contextvars.Context` for the *callback* to run in.
2897db96d56Sopenharmony_ci   The current context is used when no *context* is provided.
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci   .. versionchanged:: 3.7
2927db96d56Sopenharmony_ci      The *context* keyword-only parameter was added. See :pep:`567`
2937db96d56Sopenharmony_ci      for more details.
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci   .. versionchanged:: 3.8
2967db96d56Sopenharmony_ci      In Python 3.7 and earlier with the default event loop implementation,
2977db96d56Sopenharmony_ci      the *delay* could not exceed one day.
2987db96d56Sopenharmony_ci      This has been fixed in Python 3.8.
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci.. method:: loop.call_at(when, callback, *args, context=None)
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci   Schedule *callback* to be called at the given absolute timestamp
3037db96d56Sopenharmony_ci   *when* (an int or a float), using the same time reference as
3047db96d56Sopenharmony_ci   :meth:`loop.time`.
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ci   This method's behavior is the same as :meth:`call_later`.
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci   An instance of :class:`asyncio.TimerHandle` is returned which can
3097db96d56Sopenharmony_ci   be used to cancel the callback.
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci   .. versionchanged:: 3.7
3127db96d56Sopenharmony_ci      The *context* keyword-only parameter was added. See :pep:`567`
3137db96d56Sopenharmony_ci      for more details.
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ci   .. versionchanged:: 3.8
3167db96d56Sopenharmony_ci      In Python 3.7 and earlier with the default event loop implementation,
3177db96d56Sopenharmony_ci      the difference between *when* and the current time could not exceed
3187db96d56Sopenharmony_ci      one day.  This has been fixed in Python 3.8.
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci.. method:: loop.time()
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci   Return the current time, as a :class:`float` value, according to
3237db96d56Sopenharmony_ci   the event loop's internal monotonic clock.
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci.. note::
3267db96d56Sopenharmony_ci   .. versionchanged:: 3.8
3277db96d56Sopenharmony_ci      In Python 3.7 and earlier timeouts (relative *delay* or absolute *when*)
3287db96d56Sopenharmony_ci      should not exceed one day.  This has been fixed in Python 3.8.
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci.. seealso::
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci   The :func:`asyncio.sleep` function.
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ciCreating Futures and Tasks
3367db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci.. method:: loop.create_future()
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci   Create an :class:`asyncio.Future` object attached to the event loop.
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci   This is the preferred way to create Futures in asyncio. This lets
3437db96d56Sopenharmony_ci   third-party event loops provide alternative implementations of
3447db96d56Sopenharmony_ci   the Future object (with better performance or instrumentation).
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci   .. versionadded:: 3.5.2
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci.. method:: loop.create_task(coro, *, name=None, context=None)
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci   Schedule the execution of :ref:`coroutine <coroutine>` *coro*.
3517db96d56Sopenharmony_ci   Return a :class:`Task` object.
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci   Third-party event loops can use their own subclass of :class:`Task`
3547db96d56Sopenharmony_ci   for interoperability. In this case, the result type is a subclass
3557db96d56Sopenharmony_ci   of :class:`Task`.
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci   If the *name* argument is provided and not ``None``, it is set as
3587db96d56Sopenharmony_ci   the name of the task using :meth:`Task.set_name`.
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci   An optional keyword-only *context* argument allows specifying a
3617db96d56Sopenharmony_ci   custom :class:`contextvars.Context` for the *coro* to run in.
3627db96d56Sopenharmony_ci   The current context copy is created when no *context* is provided.
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci   .. versionchanged:: 3.8
3657db96d56Sopenharmony_ci      Added the *name* parameter.
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci   .. versionchanged:: 3.11
3687db96d56Sopenharmony_ci      Added the *context* parameter.
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_ci.. method:: loop.set_task_factory(factory)
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci   Set a task factory that will be used by
3737db96d56Sopenharmony_ci   :meth:`loop.create_task`.
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci   If *factory* is ``None`` the default task factory will be set.
3767db96d56Sopenharmony_ci   Otherwise, *factory* must be a *callable* with the signature matching
3777db96d56Sopenharmony_ci   ``(loop, coro, context=None)``, where *loop* is a reference to the active
3787db96d56Sopenharmony_ci   event loop, and *coro* is a coroutine object.  The callable
3797db96d56Sopenharmony_ci   must return a :class:`asyncio.Future`-compatible object.
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci.. method:: loop.get_task_factory()
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci   Return a task factory or ``None`` if the default one is in use.
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ci
3867db96d56Sopenharmony_ciOpening network connections
3877db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci.. coroutinemethod:: loop.create_connection(protocol_factory, \
3907db96d56Sopenharmony_ci                          host=None, port=None, *, ssl=None, \
3917db96d56Sopenharmony_ci                          family=0, proto=0, flags=0, sock=None, \
3927db96d56Sopenharmony_ci                          local_addr=None, server_hostname=None, \
3937db96d56Sopenharmony_ci                          ssl_handshake_timeout=None, \
3947db96d56Sopenharmony_ci                          ssl_shutdown_timeout=None, \
3957db96d56Sopenharmony_ci                          happy_eyeballs_delay=None, interleave=None)
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci   Open a streaming transport connection to a given
3987db96d56Sopenharmony_ci   address specified by *host* and *port*.
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci   The socket family can be either :py:data:`~socket.AF_INET` or
4017db96d56Sopenharmony_ci   :py:data:`~socket.AF_INET6` depending on *host* (or the *family*
4027db96d56Sopenharmony_ci   argument, if provided).
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci   The socket type will be :py:data:`~socket.SOCK_STREAM`.
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci   *protocol_factory* must be a callable returning an
4077db96d56Sopenharmony_ci   :ref:`asyncio protocol <asyncio-protocol>` implementation.
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci   This method will try to establish the connection in the background.
4107db96d56Sopenharmony_ci   When successful, it returns a ``(transport, protocol)`` pair.
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci   The chronological synopsis of the underlying operation is as follows:
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ci   #. The connection is established and a :ref:`transport <asyncio-transport>`
4157db96d56Sopenharmony_ci      is created for it.
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci   #. *protocol_factory* is called without arguments and is expected to
4187db96d56Sopenharmony_ci      return a :ref:`protocol <asyncio-protocol>` instance.
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci   #. The protocol instance is coupled with the transport by calling its
4217db96d56Sopenharmony_ci      :meth:`~BaseProtocol.connection_made` method.
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci   #. A ``(transport, protocol)`` tuple is returned on success.
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci   The created transport is an implementation-dependent bidirectional
4267db96d56Sopenharmony_ci   stream.
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci   Other arguments:
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci   * *ssl*: if given and not false, a SSL/TLS transport is created
4317db96d56Sopenharmony_ci     (by default a plain TCP transport is created).  If *ssl* is
4327db96d56Sopenharmony_ci     a :class:`ssl.SSLContext` object, this context is used to create
4337db96d56Sopenharmony_ci     the transport; if *ssl* is :const:`True`, a default context returned
4347db96d56Sopenharmony_ci     from :func:`ssl.create_default_context` is used.
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ci     .. seealso:: :ref:`SSL/TLS security considerations <ssl-security>`
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci   * *server_hostname* sets or overrides the hostname that the target
4397db96d56Sopenharmony_ci     server's certificate will be matched against.  Should only be passed
4407db96d56Sopenharmony_ci     if *ssl* is not ``None``.  By default the value of the *host* argument
4417db96d56Sopenharmony_ci     is used.  If *host* is empty, there is no default and you must pass a
4427db96d56Sopenharmony_ci     value for *server_hostname*.  If *server_hostname* is an empty
4437db96d56Sopenharmony_ci     string, hostname matching is disabled (which is a serious security
4447db96d56Sopenharmony_ci     risk, allowing for potential man-in-the-middle attacks).
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci   * *family*, *proto*, *flags* are the optional address family, protocol
4477db96d56Sopenharmony_ci     and flags to be passed through to getaddrinfo() for *host* resolution.
4487db96d56Sopenharmony_ci     If given, these should all be integers from the corresponding
4497db96d56Sopenharmony_ci     :mod:`socket` module constants.
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ci   * *happy_eyeballs_delay*, if given, enables Happy Eyeballs for this
4527db96d56Sopenharmony_ci     connection. It should
4537db96d56Sopenharmony_ci     be a floating-point number representing the amount of time in seconds
4547db96d56Sopenharmony_ci     to wait for a connection attempt to complete, before starting the next
4557db96d56Sopenharmony_ci     attempt in parallel. This is the "Connection Attempt Delay" as defined
4567db96d56Sopenharmony_ci     in :rfc:`8305`. A sensible default value recommended by the RFC is ``0.25``
4577db96d56Sopenharmony_ci     (250 milliseconds).
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci   * *interleave* controls address reordering when a host name resolves to
4607db96d56Sopenharmony_ci     multiple IP addresses.
4617db96d56Sopenharmony_ci     If ``0`` or unspecified, no reordering is done, and addresses are
4627db96d56Sopenharmony_ci     tried in the order returned by :meth:`getaddrinfo`. If a positive integer
4637db96d56Sopenharmony_ci     is specified, the addresses are interleaved by address family, and the
4647db96d56Sopenharmony_ci     given integer is interpreted as "First Address Family Count" as defined
4657db96d56Sopenharmony_ci     in :rfc:`8305`. The default is ``0`` if *happy_eyeballs_delay* is not
4667db96d56Sopenharmony_ci     specified, and ``1`` if it is.
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci   * *sock*, if given, should be an existing, already connected
4697db96d56Sopenharmony_ci     :class:`socket.socket` object to be used by the transport.
4707db96d56Sopenharmony_ci     If *sock* is given, none of *host*, *port*, *family*, *proto*, *flags*,
4717db96d56Sopenharmony_ci     *happy_eyeballs_delay*, *interleave*
4727db96d56Sopenharmony_ci     and *local_addr* should be specified.
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci     .. note::
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci        The *sock* argument transfers ownership of the socket to the
4777db96d56Sopenharmony_ci        transport created. To close the socket, call the transport's
4787db96d56Sopenharmony_ci        :meth:`~asyncio.BaseTransport.close` method.
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci   * *local_addr*, if given, is a ``(local_host, local_port)`` tuple used
4817db96d56Sopenharmony_ci     to bind the socket locally.  The *local_host* and *local_port*
4827db96d56Sopenharmony_ci     are looked up using ``getaddrinfo()``, similarly to *host* and *port*.
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci   * *ssl_handshake_timeout* is (for a TLS connection) the time in seconds
4857db96d56Sopenharmony_ci     to wait for the TLS handshake to complete before aborting the connection.
4867db96d56Sopenharmony_ci     ``60.0`` seconds if ``None`` (default).
4877db96d56Sopenharmony_ci
4887db96d56Sopenharmony_ci   * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
4897db96d56Sopenharmony_ci     to complete before aborting the connection. ``30.0`` seconds if ``None``
4907db96d56Sopenharmony_ci     (default).
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ci   .. versionchanged:: 3.5
4937db96d56Sopenharmony_ci
4947db96d56Sopenharmony_ci      Added support for SSL/TLS in :class:`ProactorEventLoop`.
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci   .. versionchanged:: 3.6
4977db96d56Sopenharmony_ci
4987db96d56Sopenharmony_ci      The socket option :py:data:`~socket.TCP_NODELAY` is set by default
4997db96d56Sopenharmony_ci      for all TCP connections.
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci   .. versionchanged:: 3.7
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci      Added the *ssl_handshake_timeout* parameter.
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ci   .. versionchanged:: 3.8
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci      Added the *happy_eyeballs_delay* and *interleave* parameters.
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci      Happy Eyeballs Algorithm: Success with Dual-Stack Hosts.
5107db96d56Sopenharmony_ci      When a server's IPv4 path and protocol are working, but the server's
5117db96d56Sopenharmony_ci      IPv6 path and protocol are not working, a dual-stack client
5127db96d56Sopenharmony_ci      application experiences significant connection delay compared to an
5137db96d56Sopenharmony_ci      IPv4-only client.  This is undesirable because it causes the
5147db96d56Sopenharmony_ci      dual-stack client to have a worse user experience.  This document
5157db96d56Sopenharmony_ci      specifies requirements for algorithms that reduce this user-visible
5167db96d56Sopenharmony_ci      delay and provides an algorithm.
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci      For more information: https://datatracker.ietf.org/doc/html/rfc6555
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci   .. versionchanged:: 3.11
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci   .. seealso::
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci      The :func:`open_connection` function is a high-level alternative
5277db96d56Sopenharmony_ci      API.  It returns a pair of (:class:`StreamReader`, :class:`StreamWriter`)
5287db96d56Sopenharmony_ci      that can be used directly in async/await code.
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci.. coroutinemethod:: loop.create_datagram_endpoint(protocol_factory, \
5317db96d56Sopenharmony_ci                        local_addr=None, remote_addr=None, *, \
5327db96d56Sopenharmony_ci                        family=0, proto=0, flags=0, \
5337db96d56Sopenharmony_ci                        reuse_port=None, \
5347db96d56Sopenharmony_ci                        allow_broadcast=None, sock=None)
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci   Create a datagram connection.
5377db96d56Sopenharmony_ci
5387db96d56Sopenharmony_ci   The socket family can be either :py:data:`~socket.AF_INET`,
5397db96d56Sopenharmony_ci   :py:data:`~socket.AF_INET6`, or :py:data:`~socket.AF_UNIX`,
5407db96d56Sopenharmony_ci   depending on *host* (or the *family* argument, if provided).
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci   The socket type will be :py:data:`~socket.SOCK_DGRAM`.
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci   *protocol_factory* must be a callable returning a
5457db96d56Sopenharmony_ci   :ref:`protocol <asyncio-protocol>` implementation.
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ci   A tuple of ``(transport, protocol)`` is returned on success.
5487db96d56Sopenharmony_ci
5497db96d56Sopenharmony_ci   Other arguments:
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ci   * *local_addr*, if given, is a ``(local_host, local_port)`` tuple used
5527db96d56Sopenharmony_ci     to bind the socket locally.  The *local_host* and *local_port*
5537db96d56Sopenharmony_ci     are looked up using :meth:`getaddrinfo`.
5547db96d56Sopenharmony_ci
5557db96d56Sopenharmony_ci   * *remote_addr*, if given, is a ``(remote_host, remote_port)`` tuple used
5567db96d56Sopenharmony_ci     to connect the socket to a remote address.  The *remote_host* and
5577db96d56Sopenharmony_ci     *remote_port* are looked up using :meth:`getaddrinfo`.
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci   * *family*, *proto*, *flags* are the optional address family, protocol
5607db96d56Sopenharmony_ci     and flags to be passed through to :meth:`getaddrinfo` for *host*
5617db96d56Sopenharmony_ci     resolution. If given, these should all be integers from the
5627db96d56Sopenharmony_ci     corresponding :mod:`socket` module constants.
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci   * *reuse_port* tells the kernel to allow this endpoint to be bound to the
5657db96d56Sopenharmony_ci     same port as other existing endpoints are bound to, so long as they all
5667db96d56Sopenharmony_ci     set this flag when being created. This option is not supported on Windows
5677db96d56Sopenharmony_ci     and some Unixes. If the :py:data:`~socket.SO_REUSEPORT` constant is not
5687db96d56Sopenharmony_ci     defined then this capability is unsupported.
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ci   * *allow_broadcast* tells the kernel to allow this endpoint to send
5717db96d56Sopenharmony_ci     messages to the broadcast address.
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci   * *sock* can optionally be specified in order to use a preexisting,
5747db96d56Sopenharmony_ci     already connected, :class:`socket.socket` object to be used by the
5757db96d56Sopenharmony_ci     transport. If specified, *local_addr* and *remote_addr* should be omitted
5767db96d56Sopenharmony_ci     (must be :const:`None`).
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci     .. note::
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci        The *sock* argument transfers ownership of the socket to the
5817db96d56Sopenharmony_ci        transport created. To close the socket, call the transport's
5827db96d56Sopenharmony_ci        :meth:`~asyncio.BaseTransport.close` method.
5837db96d56Sopenharmony_ci
5847db96d56Sopenharmony_ci   See :ref:`UDP echo client protocol <asyncio-udp-echo-client-protocol>` and
5857db96d56Sopenharmony_ci   :ref:`UDP echo server protocol <asyncio-udp-echo-server-protocol>` examples.
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci   .. versionchanged:: 3.4.4
5887db96d56Sopenharmony_ci      The *family*, *proto*, *flags*, *reuse_address*, *reuse_port*,
5897db96d56Sopenharmony_ci      *allow_broadcast*, and *sock* parameters were added.
5907db96d56Sopenharmony_ci
5917db96d56Sopenharmony_ci   .. versionchanged:: 3.8.1
5927db96d56Sopenharmony_ci      The *reuse_address* parameter is no longer supported, as using
5937db96d56Sopenharmony_ci      :py:data:`~sockets.SO_REUSEADDR` poses a significant security concern for
5947db96d56Sopenharmony_ci      UDP. Explicitly passing ``reuse_address=True`` will raise an exception.
5957db96d56Sopenharmony_ci
5967db96d56Sopenharmony_ci      When multiple processes with differing UIDs assign sockets to an
5977db96d56Sopenharmony_ci      identical UDP socket address with ``SO_REUSEADDR``, incoming packets can
5987db96d56Sopenharmony_ci      become randomly distributed among the sockets.
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci      For supported platforms, *reuse_port* can be used as a replacement for
6017db96d56Sopenharmony_ci      similar functionality. With *reuse_port*,
6027db96d56Sopenharmony_ci      :py:data:`~sockets.SO_REUSEPORT` is used instead, which specifically
6037db96d56Sopenharmony_ci      prevents processes with differing UIDs from assigning sockets to the same
6047db96d56Sopenharmony_ci      socket address.
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ci   .. versionchanged:: 3.8
6077db96d56Sopenharmony_ci      Added support for Windows.
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci   .. versionchanged:: 3.11
6107db96d56Sopenharmony_ci      The *reuse_address* parameter, disabled since Python 3.9.0, 3.8.1,
6117db96d56Sopenharmony_ci      3.7.6 and 3.6.10, has been entirely removed.
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci.. coroutinemethod:: loop.create_unix_connection(protocol_factory, \
6147db96d56Sopenharmony_ci                        path=None, *, ssl=None, sock=None, \
6157db96d56Sopenharmony_ci                        server_hostname=None, ssl_handshake_timeout=None, \
6167db96d56Sopenharmony_ci                        ssl_shutdown_timeout=None)
6177db96d56Sopenharmony_ci
6187db96d56Sopenharmony_ci   Create a Unix connection.
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci   The socket family will be :py:data:`~socket.AF_UNIX`; socket
6217db96d56Sopenharmony_ci   type will be :py:data:`~socket.SOCK_STREAM`.
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci   A tuple of ``(transport, protocol)`` is returned on success.
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci   *path* is the name of a Unix domain socket and is required,
6267db96d56Sopenharmony_ci   unless a *sock* parameter is specified.  Abstract Unix sockets,
6277db96d56Sopenharmony_ci   :class:`str`, :class:`bytes`, and :class:`~pathlib.Path` paths are
6287db96d56Sopenharmony_ci   supported.
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci   See the documentation of the :meth:`loop.create_connection` method
6317db96d56Sopenharmony_ci   for information about arguments to this method.
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci   .. availability:: Unix.
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci   .. versionchanged:: 3.7
6367db96d56Sopenharmony_ci      Added the *ssl_handshake_timeout* parameter.
6377db96d56Sopenharmony_ci      The *path* parameter can now be a :term:`path-like object`.
6387db96d56Sopenharmony_ci
6397db96d56Sopenharmony_ci   .. versionchanged:: 3.11
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
6427db96d56Sopenharmony_ci
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ciCreating network servers
6457db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci.. coroutinemethod:: loop.create_server(protocol_factory, \
6487db96d56Sopenharmony_ci                        host=None, port=None, *, \
6497db96d56Sopenharmony_ci                        family=socket.AF_UNSPEC, \
6507db96d56Sopenharmony_ci                        flags=socket.AI_PASSIVE, \
6517db96d56Sopenharmony_ci                        sock=None, backlog=100, ssl=None, \
6527db96d56Sopenharmony_ci                        reuse_address=None, reuse_port=None, \
6537db96d56Sopenharmony_ci                        ssl_handshake_timeout=None, \
6547db96d56Sopenharmony_ci                        ssl_shutdown_timeout=None, \
6557db96d56Sopenharmony_ci                        start_serving=True)
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci   Create a TCP server (socket type :data:`~socket.SOCK_STREAM`) listening
6587db96d56Sopenharmony_ci   on *port* of the *host* address.
6597db96d56Sopenharmony_ci
6607db96d56Sopenharmony_ci   Returns a :class:`Server` object.
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci   Arguments:
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci   * *protocol_factory* must be a callable returning a
6657db96d56Sopenharmony_ci     :ref:`protocol <asyncio-protocol>` implementation.
6667db96d56Sopenharmony_ci
6677db96d56Sopenharmony_ci   * The *host* parameter can be set to several types which determine where
6687db96d56Sopenharmony_ci     the server would be listening:
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci     - If *host* is a string, the TCP server is bound to a single network
6717db96d56Sopenharmony_ci       interface specified by *host*.
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci     - If *host* is a sequence of strings, the TCP server is bound to all
6747db96d56Sopenharmony_ci       network interfaces specified by the sequence.
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci     - If *host* is an empty string or ``None``, all interfaces are
6777db96d56Sopenharmony_ci       assumed and a list of multiple sockets will be returned (most likely
6787db96d56Sopenharmony_ci       one for IPv4 and another one for IPv6).
6797db96d56Sopenharmony_ci
6807db96d56Sopenharmony_ci   * The *port* parameter can be set to specify which port the server should
6817db96d56Sopenharmony_ci     listen on. If ``0`` or ``None`` (the default), a random unused port will
6827db96d56Sopenharmony_ci     be selected (note that if *host* resolves to multiple network interfaces,
6837db96d56Sopenharmony_ci     a different random port will be selected for each interface).
6847db96d56Sopenharmony_ci
6857db96d56Sopenharmony_ci   * *family* can be set to either :data:`socket.AF_INET` or
6867db96d56Sopenharmony_ci     :data:`~socket.AF_INET6` to force the socket to use IPv4 or IPv6.
6877db96d56Sopenharmony_ci     If not set, the *family* will be determined from host name
6887db96d56Sopenharmony_ci     (defaults to :data:`~socket.AF_UNSPEC`).
6897db96d56Sopenharmony_ci
6907db96d56Sopenharmony_ci   * *flags* is a bitmask for :meth:`getaddrinfo`.
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci   * *sock* can optionally be specified in order to use a preexisting
6937db96d56Sopenharmony_ci     socket object. If specified, *host* and *port* must not be specified.
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci     .. note::
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci        The *sock* argument transfers ownership of the socket to the
6987db96d56Sopenharmony_ci        server created. To close the socket, call the server's
6997db96d56Sopenharmony_ci        :meth:`~asyncio.Server.close` method.
7007db96d56Sopenharmony_ci
7017db96d56Sopenharmony_ci   * *backlog* is the maximum number of queued connections passed to
7027db96d56Sopenharmony_ci     :meth:`~socket.socket.listen` (defaults to 100).
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci   * *ssl* can be set to an :class:`~ssl.SSLContext` instance to enable
7057db96d56Sopenharmony_ci     TLS over the accepted connections.
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci   * *reuse_address* tells the kernel to reuse a local socket in
7087db96d56Sopenharmony_ci     ``TIME_WAIT`` state, without waiting for its natural timeout to
7097db96d56Sopenharmony_ci     expire. If not specified will automatically be set to ``True`` on
7107db96d56Sopenharmony_ci     Unix.
7117db96d56Sopenharmony_ci
7127db96d56Sopenharmony_ci   * *reuse_port* tells the kernel to allow this endpoint to be bound to the
7137db96d56Sopenharmony_ci     same port as other existing endpoints are bound to, so long as they all
7147db96d56Sopenharmony_ci     set this flag when being created. This option is not supported on
7157db96d56Sopenharmony_ci     Windows.
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci   * *ssl_handshake_timeout* is (for a TLS server) the time in seconds to wait
7187db96d56Sopenharmony_ci     for the TLS handshake to complete before aborting the connection.
7197db96d56Sopenharmony_ci     ``60.0`` seconds if ``None`` (default).
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ci   * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
7227db96d56Sopenharmony_ci     to complete before aborting the connection. ``30.0`` seconds if ``None``
7237db96d56Sopenharmony_ci     (default).
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci   * *start_serving* set to ``True`` (the default) causes the created server
7267db96d56Sopenharmony_ci     to start accepting connections immediately.  When set to ``False``,
7277db96d56Sopenharmony_ci     the user should await on :meth:`Server.start_serving` or
7287db96d56Sopenharmony_ci     :meth:`Server.serve_forever` to make the server to start accepting
7297db96d56Sopenharmony_ci     connections.
7307db96d56Sopenharmony_ci
7317db96d56Sopenharmony_ci   .. versionchanged:: 3.5
7327db96d56Sopenharmony_ci
7337db96d56Sopenharmony_ci      Added support for SSL/TLS in :class:`ProactorEventLoop`.
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci   .. versionchanged:: 3.5.1
7367db96d56Sopenharmony_ci
7377db96d56Sopenharmony_ci      The *host* parameter can be a sequence of strings.
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ci   .. versionchanged:: 3.6
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ci      Added *ssl_handshake_timeout* and *start_serving* parameters.
7427db96d56Sopenharmony_ci      The socket option :py:data:`~socket.TCP_NODELAY` is set by default
7437db96d56Sopenharmony_ci      for all TCP connections.
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci   .. versionchanged:: 3.11
7467db96d56Sopenharmony_ci
7477db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci   .. seealso::
7507db96d56Sopenharmony_ci
7517db96d56Sopenharmony_ci      The :func:`start_server` function is a higher-level alternative API
7527db96d56Sopenharmony_ci      that returns a pair of :class:`StreamReader` and :class:`StreamWriter`
7537db96d56Sopenharmony_ci      that can be used in an async/await code.
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci
7567db96d56Sopenharmony_ci.. coroutinemethod:: loop.create_unix_server(protocol_factory, path=None, \
7577db96d56Sopenharmony_ci                          *, sock=None, backlog=100, ssl=None, \
7587db96d56Sopenharmony_ci                          ssl_handshake_timeout=None, \
7597db96d56Sopenharmony_ci                          ssl_shutdown_timeout=None, \
7607db96d56Sopenharmony_ci                          start_serving=True)
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ci   Similar to :meth:`loop.create_server` but works with the
7637db96d56Sopenharmony_ci   :py:data:`~socket.AF_UNIX` socket family.
7647db96d56Sopenharmony_ci
7657db96d56Sopenharmony_ci   *path* is the name of a Unix domain socket, and is required,
7667db96d56Sopenharmony_ci   unless a *sock* argument is provided.  Abstract Unix sockets,
7677db96d56Sopenharmony_ci   :class:`str`, :class:`bytes`, and :class:`~pathlib.Path` paths
7687db96d56Sopenharmony_ci   are supported.
7697db96d56Sopenharmony_ci
7707db96d56Sopenharmony_ci   See the documentation of the :meth:`loop.create_server` method
7717db96d56Sopenharmony_ci   for information about arguments to this method.
7727db96d56Sopenharmony_ci
7737db96d56Sopenharmony_ci   .. availability:: Unix.
7747db96d56Sopenharmony_ci
7757db96d56Sopenharmony_ci   .. versionchanged:: 3.7
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci      Added the *ssl_handshake_timeout* and *start_serving* parameters.
7787db96d56Sopenharmony_ci      The *path* parameter can now be a :class:`~pathlib.Path` object.
7797db96d56Sopenharmony_ci
7807db96d56Sopenharmony_ci   .. versionchanged:: 3.11
7817db96d56Sopenharmony_ci
7827db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
7837db96d56Sopenharmony_ci
7847db96d56Sopenharmony_ci
7857db96d56Sopenharmony_ci.. coroutinemethod:: loop.connect_accepted_socket(protocol_factory, \
7867db96d56Sopenharmony_ci                        sock, *, ssl=None, ssl_handshake_timeout=None, \
7877db96d56Sopenharmony_ci                        ssl_shutdown_timeout=None)
7887db96d56Sopenharmony_ci
7897db96d56Sopenharmony_ci   Wrap an already accepted connection into a transport/protocol pair.
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci   This method can be used by servers that accept connections outside
7927db96d56Sopenharmony_ci   of asyncio but that use asyncio to handle them.
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci   Parameters:
7957db96d56Sopenharmony_ci
7967db96d56Sopenharmony_ci   * *protocol_factory* must be a callable returning a
7977db96d56Sopenharmony_ci     :ref:`protocol <asyncio-protocol>` implementation.
7987db96d56Sopenharmony_ci
7997db96d56Sopenharmony_ci   * *sock* is a preexisting socket object returned from
8007db96d56Sopenharmony_ci     :meth:`socket.accept <socket.socket.accept>`.
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ci     .. note::
8037db96d56Sopenharmony_ci
8047db96d56Sopenharmony_ci        The *sock* argument transfers ownership of the socket to the
8057db96d56Sopenharmony_ci        transport created. To close the socket, call the transport's
8067db96d56Sopenharmony_ci        :meth:`~asyncio.BaseTransport.close` method.
8077db96d56Sopenharmony_ci
8087db96d56Sopenharmony_ci   * *ssl* can be set to an :class:`~ssl.SSLContext` to enable SSL over
8097db96d56Sopenharmony_ci     the accepted connections.
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ci   * *ssl_handshake_timeout* is (for an SSL connection) the time in seconds to
8127db96d56Sopenharmony_ci     wait for the SSL handshake to complete before aborting the connection.
8137db96d56Sopenharmony_ci     ``60.0`` seconds if ``None`` (default).
8147db96d56Sopenharmony_ci
8157db96d56Sopenharmony_ci   * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
8167db96d56Sopenharmony_ci     to complete before aborting the connection. ``30.0`` seconds if ``None``
8177db96d56Sopenharmony_ci     (default).
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ci   Returns a ``(transport, protocol)`` pair.
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_ci   .. versionadded:: 3.5.3
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ci   .. versionchanged:: 3.7
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci      Added the *ssl_handshake_timeout* parameter.
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ci   .. versionchanged:: 3.11
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci
8327db96d56Sopenharmony_ciTransferring files
8337db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci.. coroutinemethod:: loop.sendfile(transport, file, \
8367db96d56Sopenharmony_ci                                   offset=0, count=None, *, fallback=True)
8377db96d56Sopenharmony_ci
8387db96d56Sopenharmony_ci   Send a *file* over a *transport*.  Return the total number of bytes
8397db96d56Sopenharmony_ci   sent.
8407db96d56Sopenharmony_ci
8417db96d56Sopenharmony_ci   The method uses high-performance :meth:`os.sendfile` if available.
8427db96d56Sopenharmony_ci
8437db96d56Sopenharmony_ci   *file* must be a regular file object opened in binary mode.
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci   *offset* tells from where to start reading the file. If specified,
8467db96d56Sopenharmony_ci   *count* is the total number of bytes to transmit as opposed to
8477db96d56Sopenharmony_ci   sending the file until EOF is reached. File position is always updated,
8487db96d56Sopenharmony_ci   even when this method raises an error, and
8497db96d56Sopenharmony_ci   :meth:`file.tell() <io.IOBase.tell>` can be used to obtain the actual
8507db96d56Sopenharmony_ci   number of bytes sent.
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ci   *fallback* set to ``True`` makes asyncio to manually read and send
8537db96d56Sopenharmony_ci   the file when the platform does not support the sendfile system call
8547db96d56Sopenharmony_ci   (e.g. Windows or SSL socket on Unix).
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ci   Raise :exc:`SendfileNotAvailableError` if the system does not support
8577db96d56Sopenharmony_ci   the *sendfile* syscall and *fallback* is ``False``.
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_ci   .. versionadded:: 3.7
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci
8627db96d56Sopenharmony_ciTLS Upgrade
8637db96d56Sopenharmony_ci^^^^^^^^^^^
8647db96d56Sopenharmony_ci
8657db96d56Sopenharmony_ci.. coroutinemethod:: loop.start_tls(transport, protocol, \
8667db96d56Sopenharmony_ci                        sslcontext, *, server_side=False, \
8677db96d56Sopenharmony_ci                        server_hostname=None, ssl_handshake_timeout=None, \
8687db96d56Sopenharmony_ci                        ssl_shutdown_timeout=None)
8697db96d56Sopenharmony_ci
8707db96d56Sopenharmony_ci   Upgrade an existing transport-based connection to TLS.
8717db96d56Sopenharmony_ci
8727db96d56Sopenharmony_ci   Create a TLS coder/decoder instance and insert it between the *transport*
8737db96d56Sopenharmony_ci   and the *protocol*. The coder/decoder implements both *transport*-facing
8747db96d56Sopenharmony_ci   protocol and *protocol*-facing transport.
8757db96d56Sopenharmony_ci
8767db96d56Sopenharmony_ci   Return the created two-interface instance. After *await*, the *protocol*
8777db96d56Sopenharmony_ci   must stop using the original *transport* and communicate with the returned
8787db96d56Sopenharmony_ci   object only because the coder caches *protocol*-side data and sporadically
8797db96d56Sopenharmony_ci   exchanges extra TLS session packets with *transport*.
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ci   Parameters:
8827db96d56Sopenharmony_ci
8837db96d56Sopenharmony_ci   * *transport* and *protocol* instances that methods like
8847db96d56Sopenharmony_ci     :meth:`~loop.create_server` and
8857db96d56Sopenharmony_ci     :meth:`~loop.create_connection` return.
8867db96d56Sopenharmony_ci
8877db96d56Sopenharmony_ci   * *sslcontext*: a configured instance of :class:`~ssl.SSLContext`.
8887db96d56Sopenharmony_ci
8897db96d56Sopenharmony_ci   * *server_side* pass ``True`` when a server-side connection is being
8907db96d56Sopenharmony_ci     upgraded (like the one created by :meth:`~loop.create_server`).
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci   * *server_hostname*: sets or overrides the host name that the target
8937db96d56Sopenharmony_ci     server's certificate will be matched against.
8947db96d56Sopenharmony_ci
8957db96d56Sopenharmony_ci   * *ssl_handshake_timeout* is (for a TLS connection) the time in seconds to
8967db96d56Sopenharmony_ci     wait for the TLS handshake to complete before aborting the connection.
8977db96d56Sopenharmony_ci     ``60.0`` seconds if ``None`` (default).
8987db96d56Sopenharmony_ci
8997db96d56Sopenharmony_ci   * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
9007db96d56Sopenharmony_ci     to complete before aborting the connection. ``30.0`` seconds if ``None``
9017db96d56Sopenharmony_ci     (default).
9027db96d56Sopenharmony_ci
9037db96d56Sopenharmony_ci   .. versionadded:: 3.7
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci   .. versionchanged:: 3.11
9067db96d56Sopenharmony_ci
9077db96d56Sopenharmony_ci      Added the *ssl_shutdown_timeout* parameter.
9087db96d56Sopenharmony_ci
9097db96d56Sopenharmony_ci
9107db96d56Sopenharmony_ci
9117db96d56Sopenharmony_ciWatching file descriptors
9127db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^
9137db96d56Sopenharmony_ci
9147db96d56Sopenharmony_ci.. method:: loop.add_reader(fd, callback, *args)
9157db96d56Sopenharmony_ci
9167db96d56Sopenharmony_ci   Start monitoring the *fd* file descriptor for read availability and
9177db96d56Sopenharmony_ci   invoke *callback* with the specified arguments once *fd* is available for
9187db96d56Sopenharmony_ci   reading.
9197db96d56Sopenharmony_ci
9207db96d56Sopenharmony_ci.. method:: loop.remove_reader(fd)
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci   Stop monitoring the *fd* file descriptor for read availability. Returns
9237db96d56Sopenharmony_ci   ``True`` if *fd* was previously being monitored for reads.
9247db96d56Sopenharmony_ci
9257db96d56Sopenharmony_ci.. method:: loop.add_writer(fd, callback, *args)
9267db96d56Sopenharmony_ci
9277db96d56Sopenharmony_ci   Start monitoring the *fd* file descriptor for write availability and
9287db96d56Sopenharmony_ci   invoke *callback* with the specified arguments once *fd* is available for
9297db96d56Sopenharmony_ci   writing.
9307db96d56Sopenharmony_ci
9317db96d56Sopenharmony_ci   Use :func:`functools.partial` :ref:`to pass keyword arguments
9327db96d56Sopenharmony_ci   <asyncio-pass-keywords>` to *callback*.
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ci.. method:: loop.remove_writer(fd)
9357db96d56Sopenharmony_ci
9367db96d56Sopenharmony_ci   Stop monitoring the *fd* file descriptor for write availability. Returns
9377db96d56Sopenharmony_ci   ``True`` if *fd* was previously being monitored for writes.
9387db96d56Sopenharmony_ci
9397db96d56Sopenharmony_ciSee also :ref:`Platform Support <asyncio-platform-support>` section
9407db96d56Sopenharmony_cifor some limitations of these methods.
9417db96d56Sopenharmony_ci
9427db96d56Sopenharmony_ci
9437db96d56Sopenharmony_ciWorking with socket objects directly
9447db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9457db96d56Sopenharmony_ci
9467db96d56Sopenharmony_ciIn general, protocol implementations that use transport-based APIs
9477db96d56Sopenharmony_cisuch as :meth:`loop.create_connection` and :meth:`loop.create_server`
9487db96d56Sopenharmony_ciare faster than implementations that work with sockets directly.
9497db96d56Sopenharmony_ciHowever, there are some use cases when performance is not critical, and
9507db96d56Sopenharmony_ciworking with :class:`~socket.socket` objects directly is more
9517db96d56Sopenharmony_ciconvenient.
9527db96d56Sopenharmony_ci
9537db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_recv(sock, nbytes)
9547db96d56Sopenharmony_ci
9557db96d56Sopenharmony_ci   Receive up to *nbytes* from *sock*.  Asynchronous version of
9567db96d56Sopenharmony_ci   :meth:`socket.recv() <socket.socket.recv>`.
9577db96d56Sopenharmony_ci
9587db96d56Sopenharmony_ci   Return the received data as a bytes object.
9597db96d56Sopenharmony_ci
9607db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ci   .. versionchanged:: 3.7
9637db96d56Sopenharmony_ci      Even though this method was always documented as a coroutine
9647db96d56Sopenharmony_ci      method, releases before Python 3.7 returned a :class:`Future`.
9657db96d56Sopenharmony_ci      Since Python 3.7 this is an ``async def`` method.
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_recv_into(sock, buf)
9687db96d56Sopenharmony_ci
9697db96d56Sopenharmony_ci   Receive data from *sock* into the *buf* buffer.  Modeled after the blocking
9707db96d56Sopenharmony_ci   :meth:`socket.recv_into() <socket.socket.recv_into>` method.
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ci   Return the number of bytes written to the buffer.
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
9757db96d56Sopenharmony_ci
9767db96d56Sopenharmony_ci   .. versionadded:: 3.7
9777db96d56Sopenharmony_ci
9787db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_recvfrom(sock, bufsize)
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci   Receive a datagram of up to *bufsize* from *sock*.  Asynchronous version of
9817db96d56Sopenharmony_ci   :meth:`socket.recvfrom() <socket.socket.recvfrom>`.
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_ci   Return a tuple of (received data, remote address).
9847db96d56Sopenharmony_ci
9857db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
9867db96d56Sopenharmony_ci
9877db96d56Sopenharmony_ci   .. versionadded:: 3.11
9887db96d56Sopenharmony_ci
9897db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_recvfrom_into(sock, buf, nbytes=0)
9907db96d56Sopenharmony_ci
9917db96d56Sopenharmony_ci   Receive a datagram of up to *nbytes* from *sock* into *buf*.
9927db96d56Sopenharmony_ci   Asynchronous version of
9937db96d56Sopenharmony_ci   :meth:`socket.recvfrom_into() <socket.socket.recvfrom_into>`.
9947db96d56Sopenharmony_ci
9957db96d56Sopenharmony_ci   Return a tuple of (number of bytes received, remote address).
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci   .. versionadded:: 3.11
10007db96d56Sopenharmony_ci
10017db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_sendall(sock, data)
10027db96d56Sopenharmony_ci
10037db96d56Sopenharmony_ci   Send *data* to the *sock* socket. Asynchronous version of
10047db96d56Sopenharmony_ci   :meth:`socket.sendall() <socket.socket.sendall>`.
10057db96d56Sopenharmony_ci
10067db96d56Sopenharmony_ci   This method continues to send to the socket until either all data
10077db96d56Sopenharmony_ci   in *data* has been sent or an error occurs.  ``None`` is returned
10087db96d56Sopenharmony_ci   on success.  On error, an exception is raised. Additionally, there is no way
10097db96d56Sopenharmony_ci   to determine how much data, if any, was successfully processed by the
10107db96d56Sopenharmony_ci   receiving end of the connection.
10117db96d56Sopenharmony_ci
10127db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
10137db96d56Sopenharmony_ci
10147db96d56Sopenharmony_ci   .. versionchanged:: 3.7
10157db96d56Sopenharmony_ci      Even though the method was always documented as a coroutine
10167db96d56Sopenharmony_ci      method, before Python 3.7 it returned a :class:`Future`.
10177db96d56Sopenharmony_ci      Since Python 3.7, this is an ``async def`` method.
10187db96d56Sopenharmony_ci
10197db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_sendto(sock, data, address)
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci   Send a datagram from *sock* to *address*.
10227db96d56Sopenharmony_ci   Asynchronous version of
10237db96d56Sopenharmony_ci   :meth:`socket.sendto() <socket.socket.sendto>`.
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci   Return the number of bytes sent.
10267db96d56Sopenharmony_ci
10277db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
10287db96d56Sopenharmony_ci
10297db96d56Sopenharmony_ci   .. versionadded:: 3.11
10307db96d56Sopenharmony_ci
10317db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_connect(sock, address)
10327db96d56Sopenharmony_ci
10337db96d56Sopenharmony_ci   Connect *sock* to a remote socket at *address*.
10347db96d56Sopenharmony_ci
10357db96d56Sopenharmony_ci   Asynchronous version of :meth:`socket.connect() <socket.socket.connect>`.
10367db96d56Sopenharmony_ci
10377db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
10387db96d56Sopenharmony_ci
10397db96d56Sopenharmony_ci   .. versionchanged:: 3.5.2
10407db96d56Sopenharmony_ci      ``address`` no longer needs to be resolved.  ``sock_connect``
10417db96d56Sopenharmony_ci      will try to check if the *address* is already resolved by calling
10427db96d56Sopenharmony_ci      :func:`socket.inet_pton`.  If not,
10437db96d56Sopenharmony_ci      :meth:`loop.getaddrinfo` will be used to resolve the
10447db96d56Sopenharmony_ci      *address*.
10457db96d56Sopenharmony_ci
10467db96d56Sopenharmony_ci   .. seealso::
10477db96d56Sopenharmony_ci
10487db96d56Sopenharmony_ci      :meth:`loop.create_connection`
10497db96d56Sopenharmony_ci      and  :func:`asyncio.open_connection() <open_connection>`.
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci
10527db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_accept(sock)
10537db96d56Sopenharmony_ci
10547db96d56Sopenharmony_ci   Accept a connection.  Modeled after the blocking
10557db96d56Sopenharmony_ci   :meth:`socket.accept() <socket.socket.accept>` method.
10567db96d56Sopenharmony_ci
10577db96d56Sopenharmony_ci   The socket must be bound to an address and listening
10587db96d56Sopenharmony_ci   for connections. The return value is a pair ``(conn, address)`` where *conn*
10597db96d56Sopenharmony_ci   is a *new* socket object usable to send and receive data on the connection,
10607db96d56Sopenharmony_ci   and *address* is the address bound to the socket on the other end of the
10617db96d56Sopenharmony_ci   connection.
10627db96d56Sopenharmony_ci
10637db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
10647db96d56Sopenharmony_ci
10657db96d56Sopenharmony_ci   .. versionchanged:: 3.7
10667db96d56Sopenharmony_ci      Even though the method was always documented as a coroutine
10677db96d56Sopenharmony_ci      method, before Python 3.7 it returned a :class:`Future`.
10687db96d56Sopenharmony_ci      Since Python 3.7, this is an ``async def`` method.
10697db96d56Sopenharmony_ci
10707db96d56Sopenharmony_ci   .. seealso::
10717db96d56Sopenharmony_ci
10727db96d56Sopenharmony_ci      :meth:`loop.create_server` and :func:`start_server`.
10737db96d56Sopenharmony_ci
10747db96d56Sopenharmony_ci.. coroutinemethod:: loop.sock_sendfile(sock, file, offset=0, count=None, \
10757db96d56Sopenharmony_ci                                        *, fallback=True)
10767db96d56Sopenharmony_ci
10777db96d56Sopenharmony_ci   Send a file using high-performance :mod:`os.sendfile` if possible.
10787db96d56Sopenharmony_ci   Return the total number of bytes sent.
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_ci   Asynchronous version of :meth:`socket.sendfile() <socket.socket.sendfile>`.
10817db96d56Sopenharmony_ci
10827db96d56Sopenharmony_ci   *sock* must be a non-blocking :const:`socket.SOCK_STREAM`
10837db96d56Sopenharmony_ci   :class:`~socket.socket`.
10847db96d56Sopenharmony_ci
10857db96d56Sopenharmony_ci   *file* must be a regular file object open in binary mode.
10867db96d56Sopenharmony_ci
10877db96d56Sopenharmony_ci   *offset* tells from where to start reading the file. If specified,
10887db96d56Sopenharmony_ci   *count* is the total number of bytes to transmit as opposed to
10897db96d56Sopenharmony_ci   sending the file until EOF is reached. File position is always updated,
10907db96d56Sopenharmony_ci   even when this method raises an error, and
10917db96d56Sopenharmony_ci   :meth:`file.tell() <io.IOBase.tell>` can be used to obtain the actual
10927db96d56Sopenharmony_ci   number of bytes sent.
10937db96d56Sopenharmony_ci
10947db96d56Sopenharmony_ci   *fallback*, when set to ``True``, makes asyncio manually read and send
10957db96d56Sopenharmony_ci   the file when the platform does not support the sendfile syscall
10967db96d56Sopenharmony_ci   (e.g. Windows or SSL socket on Unix).
10977db96d56Sopenharmony_ci
10987db96d56Sopenharmony_ci   Raise :exc:`SendfileNotAvailableError` if the system does not support
10997db96d56Sopenharmony_ci   *sendfile* syscall and *fallback* is ``False``.
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ci   *sock* must be a non-blocking socket.
11027db96d56Sopenharmony_ci
11037db96d56Sopenharmony_ci   .. versionadded:: 3.7
11047db96d56Sopenharmony_ci
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ciDNS
11077db96d56Sopenharmony_ci^^^
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci.. coroutinemethod:: loop.getaddrinfo(host, port, *, family=0, \
11107db96d56Sopenharmony_ci                        type=0, proto=0, flags=0)
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ci   Asynchronous version of :meth:`socket.getaddrinfo`.
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ci.. coroutinemethod:: loop.getnameinfo(sockaddr, flags=0)
11157db96d56Sopenharmony_ci
11167db96d56Sopenharmony_ci   Asynchronous version of :meth:`socket.getnameinfo`.
11177db96d56Sopenharmony_ci
11187db96d56Sopenharmony_ci.. versionchanged:: 3.7
11197db96d56Sopenharmony_ci   Both *getaddrinfo* and *getnameinfo* methods were always documented
11207db96d56Sopenharmony_ci   to return a coroutine, but prior to Python 3.7 they were, in fact,
11217db96d56Sopenharmony_ci   returning :class:`asyncio.Future` objects.  Starting with Python 3.7
11227db96d56Sopenharmony_ci   both methods are coroutines.
11237db96d56Sopenharmony_ci
11247db96d56Sopenharmony_ci
11257db96d56Sopenharmony_ciWorking with pipes
11267db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^
11277db96d56Sopenharmony_ci
11287db96d56Sopenharmony_ci.. coroutinemethod:: loop.connect_read_pipe(protocol_factory, pipe)
11297db96d56Sopenharmony_ci
11307db96d56Sopenharmony_ci   Register the read end of *pipe* in the event loop.
11317db96d56Sopenharmony_ci
11327db96d56Sopenharmony_ci   *protocol_factory* must be a callable returning an
11337db96d56Sopenharmony_ci   :ref:`asyncio protocol <asyncio-protocol>` implementation.
11347db96d56Sopenharmony_ci
11357db96d56Sopenharmony_ci   *pipe* is a :term:`file-like object <file object>`.
11367db96d56Sopenharmony_ci
11377db96d56Sopenharmony_ci   Return pair ``(transport, protocol)``, where *transport* supports
11387db96d56Sopenharmony_ci   the :class:`ReadTransport` interface and *protocol* is an object
11397db96d56Sopenharmony_ci   instantiated by the *protocol_factory*.
11407db96d56Sopenharmony_ci
11417db96d56Sopenharmony_ci   With :class:`SelectorEventLoop` event loop, the *pipe* is set to
11427db96d56Sopenharmony_ci   non-blocking mode.
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci.. coroutinemethod:: loop.connect_write_pipe(protocol_factory, pipe)
11457db96d56Sopenharmony_ci
11467db96d56Sopenharmony_ci   Register the write end of *pipe* in the event loop.
11477db96d56Sopenharmony_ci
11487db96d56Sopenharmony_ci   *protocol_factory* must be a callable returning an
11497db96d56Sopenharmony_ci   :ref:`asyncio protocol <asyncio-protocol>` implementation.
11507db96d56Sopenharmony_ci
11517db96d56Sopenharmony_ci   *pipe* is :term:`file-like object <file object>`.
11527db96d56Sopenharmony_ci
11537db96d56Sopenharmony_ci   Return pair ``(transport, protocol)``, where *transport* supports
11547db96d56Sopenharmony_ci   :class:`WriteTransport` interface and *protocol* is an object
11557db96d56Sopenharmony_ci   instantiated by the *protocol_factory*.
11567db96d56Sopenharmony_ci
11577db96d56Sopenharmony_ci   With :class:`SelectorEventLoop` event loop, the *pipe* is set to
11587db96d56Sopenharmony_ci   non-blocking mode.
11597db96d56Sopenharmony_ci
11607db96d56Sopenharmony_ci.. note::
11617db96d56Sopenharmony_ci
11627db96d56Sopenharmony_ci   :class:`SelectorEventLoop` does not support the above methods on
11637db96d56Sopenharmony_ci   Windows.  Use :class:`ProactorEventLoop` instead for Windows.
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci.. seealso::
11667db96d56Sopenharmony_ci
11677db96d56Sopenharmony_ci   The :meth:`loop.subprocess_exec` and
11687db96d56Sopenharmony_ci   :meth:`loop.subprocess_shell` methods.
11697db96d56Sopenharmony_ci
11707db96d56Sopenharmony_ci
11717db96d56Sopenharmony_ciUnix signals
11727db96d56Sopenharmony_ci^^^^^^^^^^^^
11737db96d56Sopenharmony_ci
11747db96d56Sopenharmony_ci.. method:: loop.add_signal_handler(signum, callback, *args)
11757db96d56Sopenharmony_ci
11767db96d56Sopenharmony_ci   Set *callback* as the handler for the *signum* signal.
11777db96d56Sopenharmony_ci
11787db96d56Sopenharmony_ci   The callback will be invoked by *loop*, along with other queued callbacks
11797db96d56Sopenharmony_ci   and runnable coroutines of that event loop. Unlike signal handlers
11807db96d56Sopenharmony_ci   registered using :func:`signal.signal`, a callback registered with this
11817db96d56Sopenharmony_ci   function is allowed to interact with the event loop.
11827db96d56Sopenharmony_ci
11837db96d56Sopenharmony_ci   Raise :exc:`ValueError` if the signal number is invalid or uncatchable.
11847db96d56Sopenharmony_ci   Raise :exc:`RuntimeError` if there is a problem setting up the handler.
11857db96d56Sopenharmony_ci
11867db96d56Sopenharmony_ci   Use :func:`functools.partial` :ref:`to pass keyword arguments
11877db96d56Sopenharmony_ci   <asyncio-pass-keywords>` to *callback*.
11887db96d56Sopenharmony_ci
11897db96d56Sopenharmony_ci   Like :func:`signal.signal`, this function must be invoked in the main
11907db96d56Sopenharmony_ci   thread.
11917db96d56Sopenharmony_ci
11927db96d56Sopenharmony_ci.. method:: loop.remove_signal_handler(sig)
11937db96d56Sopenharmony_ci
11947db96d56Sopenharmony_ci   Remove the handler for the *sig* signal.
11957db96d56Sopenharmony_ci
11967db96d56Sopenharmony_ci   Return ``True`` if the signal handler was removed, or ``False`` if
11977db96d56Sopenharmony_ci   no handler was set for the given signal.
11987db96d56Sopenharmony_ci
11997db96d56Sopenharmony_ci   .. availability:: Unix.
12007db96d56Sopenharmony_ci
12017db96d56Sopenharmony_ci.. seealso::
12027db96d56Sopenharmony_ci
12037db96d56Sopenharmony_ci   The :mod:`signal` module.
12047db96d56Sopenharmony_ci
12057db96d56Sopenharmony_ci
12067db96d56Sopenharmony_ciExecuting code in thread or process pools
12077db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
12087db96d56Sopenharmony_ci
12097db96d56Sopenharmony_ci.. awaitablemethod:: loop.run_in_executor(executor, func, *args)
12107db96d56Sopenharmony_ci
12117db96d56Sopenharmony_ci   Arrange for *func* to be called in the specified executor.
12127db96d56Sopenharmony_ci
12137db96d56Sopenharmony_ci   The *executor* argument should be an :class:`concurrent.futures.Executor`
12147db96d56Sopenharmony_ci   instance. The default executor is used if *executor* is ``None``.
12157db96d56Sopenharmony_ci
12167db96d56Sopenharmony_ci   Example::
12177db96d56Sopenharmony_ci
12187db96d56Sopenharmony_ci      import asyncio
12197db96d56Sopenharmony_ci      import concurrent.futures
12207db96d56Sopenharmony_ci
12217db96d56Sopenharmony_ci      def blocking_io():
12227db96d56Sopenharmony_ci          # File operations (such as logging) can block the
12237db96d56Sopenharmony_ci          # event loop: run them in a thread pool.
12247db96d56Sopenharmony_ci          with open('/dev/urandom', 'rb') as f:
12257db96d56Sopenharmony_ci              return f.read(100)
12267db96d56Sopenharmony_ci
12277db96d56Sopenharmony_ci      def cpu_bound():
12287db96d56Sopenharmony_ci          # CPU-bound operations will block the event loop:
12297db96d56Sopenharmony_ci          # in general it is preferable to run them in a
12307db96d56Sopenharmony_ci          # process pool.
12317db96d56Sopenharmony_ci          return sum(i * i for i in range(10 ** 7))
12327db96d56Sopenharmony_ci
12337db96d56Sopenharmony_ci      async def main():
12347db96d56Sopenharmony_ci          loop = asyncio.get_running_loop()
12357db96d56Sopenharmony_ci
12367db96d56Sopenharmony_ci          ## Options:
12377db96d56Sopenharmony_ci
12387db96d56Sopenharmony_ci          # 1. Run in the default loop's executor:
12397db96d56Sopenharmony_ci          result = await loop.run_in_executor(
12407db96d56Sopenharmony_ci              None, blocking_io)
12417db96d56Sopenharmony_ci          print('default thread pool', result)
12427db96d56Sopenharmony_ci
12437db96d56Sopenharmony_ci          # 2. Run in a custom thread pool:
12447db96d56Sopenharmony_ci          with concurrent.futures.ThreadPoolExecutor() as pool:
12457db96d56Sopenharmony_ci              result = await loop.run_in_executor(
12467db96d56Sopenharmony_ci                  pool, blocking_io)
12477db96d56Sopenharmony_ci              print('custom thread pool', result)
12487db96d56Sopenharmony_ci
12497db96d56Sopenharmony_ci          # 3. Run in a custom process pool:
12507db96d56Sopenharmony_ci          with concurrent.futures.ProcessPoolExecutor() as pool:
12517db96d56Sopenharmony_ci              result = await loop.run_in_executor(
12527db96d56Sopenharmony_ci                  pool, cpu_bound)
12537db96d56Sopenharmony_ci              print('custom process pool', result)
12547db96d56Sopenharmony_ci
12557db96d56Sopenharmony_ci      if __name__ == '__main__':
12567db96d56Sopenharmony_ci          asyncio.run(main())
12577db96d56Sopenharmony_ci
12587db96d56Sopenharmony_ci   Note that the entry point guard (``if __name__ == '__main__'``)
12597db96d56Sopenharmony_ci   is required for option 3 due to the peculiarities of :mod:`multiprocessing`,
12607db96d56Sopenharmony_ci   which is used by :class:`~concurrent.futures.ProcessPoolExecutor`.
12617db96d56Sopenharmony_ci   See :ref:`Safe importing of main module <multiprocessing-safe-main-import>`.
12627db96d56Sopenharmony_ci
12637db96d56Sopenharmony_ci   This method returns a :class:`asyncio.Future` object.
12647db96d56Sopenharmony_ci
12657db96d56Sopenharmony_ci   Use :func:`functools.partial` :ref:`to pass keyword arguments
12667db96d56Sopenharmony_ci   <asyncio-pass-keywords>` to *func*.
12677db96d56Sopenharmony_ci
12687db96d56Sopenharmony_ci   .. versionchanged:: 3.5.3
12697db96d56Sopenharmony_ci      :meth:`loop.run_in_executor` no longer configures the
12707db96d56Sopenharmony_ci      ``max_workers`` of the thread pool executor it creates, instead
12717db96d56Sopenharmony_ci      leaving it up to the thread pool executor
12727db96d56Sopenharmony_ci      (:class:`~concurrent.futures.ThreadPoolExecutor`) to set the
12737db96d56Sopenharmony_ci      default.
12747db96d56Sopenharmony_ci
12757db96d56Sopenharmony_ci.. method:: loop.set_default_executor(executor)
12767db96d56Sopenharmony_ci
12777db96d56Sopenharmony_ci   Set *executor* as the default executor used by :meth:`run_in_executor`.
12787db96d56Sopenharmony_ci   *executor* must be an instance of
12797db96d56Sopenharmony_ci   :class:`~concurrent.futures.ThreadPoolExecutor`.
12807db96d56Sopenharmony_ci
12817db96d56Sopenharmony_ci   .. versionchanged:: 3.11
12827db96d56Sopenharmony_ci      *executor* must be an instance of
12837db96d56Sopenharmony_ci      :class:`~concurrent.futures.ThreadPoolExecutor`.
12847db96d56Sopenharmony_ci
12857db96d56Sopenharmony_ci
12867db96d56Sopenharmony_ciError Handling API
12877db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^
12887db96d56Sopenharmony_ci
12897db96d56Sopenharmony_ciAllows customizing how exceptions are handled in the event loop.
12907db96d56Sopenharmony_ci
12917db96d56Sopenharmony_ci.. method:: loop.set_exception_handler(handler)
12927db96d56Sopenharmony_ci
12937db96d56Sopenharmony_ci   Set *handler* as the new event loop exception handler.
12947db96d56Sopenharmony_ci
12957db96d56Sopenharmony_ci   If *handler* is ``None``, the default exception handler will
12967db96d56Sopenharmony_ci   be set.  Otherwise, *handler* must be a callable with the signature
12977db96d56Sopenharmony_ci   matching ``(loop, context)``, where ``loop``
12987db96d56Sopenharmony_ci   is a reference to the active event loop, and ``context``
12997db96d56Sopenharmony_ci   is a ``dict`` object containing the details of the exception
13007db96d56Sopenharmony_ci   (see :meth:`call_exception_handler` documentation for details
13017db96d56Sopenharmony_ci   about context).
13027db96d56Sopenharmony_ci
13037db96d56Sopenharmony_ci.. method:: loop.get_exception_handler()
13047db96d56Sopenharmony_ci
13057db96d56Sopenharmony_ci   Return the current exception handler, or ``None`` if no custom
13067db96d56Sopenharmony_ci   exception handler was set.
13077db96d56Sopenharmony_ci
13087db96d56Sopenharmony_ci   .. versionadded:: 3.5.2
13097db96d56Sopenharmony_ci
13107db96d56Sopenharmony_ci.. method:: loop.default_exception_handler(context)
13117db96d56Sopenharmony_ci
13127db96d56Sopenharmony_ci   Default exception handler.
13137db96d56Sopenharmony_ci
13147db96d56Sopenharmony_ci   This is called when an exception occurs and no exception
13157db96d56Sopenharmony_ci   handler is set. This can be called by a custom exception
13167db96d56Sopenharmony_ci   handler that wants to defer to the default handler behavior.
13177db96d56Sopenharmony_ci
13187db96d56Sopenharmony_ci   *context* parameter has the same meaning as in
13197db96d56Sopenharmony_ci   :meth:`call_exception_handler`.
13207db96d56Sopenharmony_ci
13217db96d56Sopenharmony_ci.. method:: loop.call_exception_handler(context)
13227db96d56Sopenharmony_ci
13237db96d56Sopenharmony_ci   Call the current event loop exception handler.
13247db96d56Sopenharmony_ci
13257db96d56Sopenharmony_ci   *context* is a ``dict`` object containing the following keys
13267db96d56Sopenharmony_ci   (new keys may be introduced in future Python versions):
13277db96d56Sopenharmony_ci
13287db96d56Sopenharmony_ci   * 'message': Error message;
13297db96d56Sopenharmony_ci   * 'exception' (optional): Exception object;
13307db96d56Sopenharmony_ci   * 'future' (optional): :class:`asyncio.Future` instance;
13317db96d56Sopenharmony_ci   * 'task' (optional): :class:`asyncio.Task` instance;
13327db96d56Sopenharmony_ci   * 'handle' (optional): :class:`asyncio.Handle` instance;
13337db96d56Sopenharmony_ci   * 'protocol' (optional): :ref:`Protocol <asyncio-protocol>` instance;
13347db96d56Sopenharmony_ci   * 'transport' (optional): :ref:`Transport <asyncio-transport>` instance;
13357db96d56Sopenharmony_ci   * 'socket' (optional): :class:`socket.socket` instance;
13367db96d56Sopenharmony_ci   * 'asyncgen' (optional): Asynchronous generator that caused
13377db96d56Sopenharmony_ci                            the exception.
13387db96d56Sopenharmony_ci
13397db96d56Sopenharmony_ci   .. note::
13407db96d56Sopenharmony_ci
13417db96d56Sopenharmony_ci       This method should not be overloaded in subclassed
13427db96d56Sopenharmony_ci       event loops.  For custom exception handling, use
13437db96d56Sopenharmony_ci       the :meth:`set_exception_handler()` method.
13447db96d56Sopenharmony_ci
13457db96d56Sopenharmony_ciEnabling debug mode
13467db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^
13477db96d56Sopenharmony_ci
13487db96d56Sopenharmony_ci.. method:: loop.get_debug()
13497db96d56Sopenharmony_ci
13507db96d56Sopenharmony_ci   Get the debug mode (:class:`bool`) of the event loop.
13517db96d56Sopenharmony_ci
13527db96d56Sopenharmony_ci   The default value is ``True`` if the environment variable
13537db96d56Sopenharmony_ci   :envvar:`PYTHONASYNCIODEBUG` is set to a non-empty string, ``False``
13547db96d56Sopenharmony_ci   otherwise.
13557db96d56Sopenharmony_ci
13567db96d56Sopenharmony_ci.. method:: loop.set_debug(enabled: bool)
13577db96d56Sopenharmony_ci
13587db96d56Sopenharmony_ci   Set the debug mode of the event loop.
13597db96d56Sopenharmony_ci
13607db96d56Sopenharmony_ci   .. versionchanged:: 3.7
13617db96d56Sopenharmony_ci
13627db96d56Sopenharmony_ci      The new :ref:`Python Development Mode <devmode>` can now also be used
13637db96d56Sopenharmony_ci      to enable the debug mode.
13647db96d56Sopenharmony_ci
13657db96d56Sopenharmony_ci.. seealso::
13667db96d56Sopenharmony_ci
13677db96d56Sopenharmony_ci   The :ref:`debug mode of asyncio <asyncio-debug-mode>`.
13687db96d56Sopenharmony_ci
13697db96d56Sopenharmony_ci
13707db96d56Sopenharmony_ciRunning Subprocesses
13717db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^
13727db96d56Sopenharmony_ci
13737db96d56Sopenharmony_ciMethods described in this subsections are low-level.  In regular
13747db96d56Sopenharmony_ciasync/await code consider using the high-level
13757db96d56Sopenharmony_ci:func:`asyncio.create_subprocess_shell` and
13767db96d56Sopenharmony_ci:func:`asyncio.create_subprocess_exec` convenience functions instead.
13777db96d56Sopenharmony_ci
13787db96d56Sopenharmony_ci.. note::
13797db96d56Sopenharmony_ci
13807db96d56Sopenharmony_ci   On Windows, the default event loop :class:`ProactorEventLoop` supports
13817db96d56Sopenharmony_ci   subprocesses, whereas :class:`SelectorEventLoop` does not. See
13827db96d56Sopenharmony_ci   :ref:`Subprocess Support on Windows <asyncio-windows-subprocess>` for
13837db96d56Sopenharmony_ci   details.
13847db96d56Sopenharmony_ci
13857db96d56Sopenharmony_ci.. coroutinemethod:: loop.subprocess_exec(protocol_factory, *args, \
13867db96d56Sopenharmony_ci                      stdin=subprocess.PIPE, stdout=subprocess.PIPE, \
13877db96d56Sopenharmony_ci                      stderr=subprocess.PIPE, **kwargs)
13887db96d56Sopenharmony_ci
13897db96d56Sopenharmony_ci   Create a subprocess from one or more string arguments specified by
13907db96d56Sopenharmony_ci   *args*.
13917db96d56Sopenharmony_ci
13927db96d56Sopenharmony_ci   *args* must be a list of strings represented by:
13937db96d56Sopenharmony_ci
13947db96d56Sopenharmony_ci   * :class:`str`;
13957db96d56Sopenharmony_ci   * or :class:`bytes`, encoded to the
13967db96d56Sopenharmony_ci     :ref:`filesystem encoding <filesystem-encoding>`.
13977db96d56Sopenharmony_ci
13987db96d56Sopenharmony_ci   The first string specifies the program executable,
13997db96d56Sopenharmony_ci   and the remaining strings specify the arguments.  Together, string
14007db96d56Sopenharmony_ci   arguments form the ``argv`` of the program.
14017db96d56Sopenharmony_ci
14027db96d56Sopenharmony_ci   This is similar to the standard library :class:`subprocess.Popen`
14037db96d56Sopenharmony_ci   class called with ``shell=False`` and the list of strings passed as
14047db96d56Sopenharmony_ci   the first argument; however, where :class:`~subprocess.Popen` takes
14057db96d56Sopenharmony_ci   a single argument which is list of strings, *subprocess_exec*
14067db96d56Sopenharmony_ci   takes multiple string arguments.
14077db96d56Sopenharmony_ci
14087db96d56Sopenharmony_ci   The *protocol_factory* must be a callable returning a subclass of the
14097db96d56Sopenharmony_ci   :class:`asyncio.SubprocessProtocol` class.
14107db96d56Sopenharmony_ci
14117db96d56Sopenharmony_ci   Other parameters:
14127db96d56Sopenharmony_ci
14137db96d56Sopenharmony_ci   * *stdin* can be any of these:
14147db96d56Sopenharmony_ci
14157db96d56Sopenharmony_ci     * a file-like object representing a pipe to be connected to the
14167db96d56Sopenharmony_ci       subprocess's standard input stream using
14177db96d56Sopenharmony_ci       :meth:`~loop.connect_write_pipe`
14187db96d56Sopenharmony_ci     * the :const:`subprocess.PIPE` constant (default) which will create a new
14197db96d56Sopenharmony_ci       pipe and connect it,
14207db96d56Sopenharmony_ci     * the value ``None`` which will make the subprocess inherit the file
14217db96d56Sopenharmony_ci       descriptor from this process
14227db96d56Sopenharmony_ci     * the :const:`subprocess.DEVNULL` constant which indicates that the
14237db96d56Sopenharmony_ci       special :data:`os.devnull` file will be used
14247db96d56Sopenharmony_ci
14257db96d56Sopenharmony_ci   * *stdout* can be any of these:
14267db96d56Sopenharmony_ci
14277db96d56Sopenharmony_ci     * a file-like object representing a pipe to be connected to the
14287db96d56Sopenharmony_ci       subprocess's standard output stream using
14297db96d56Sopenharmony_ci       :meth:`~loop.connect_write_pipe`
14307db96d56Sopenharmony_ci     * the :const:`subprocess.PIPE` constant (default) which will create a new
14317db96d56Sopenharmony_ci       pipe and connect it,
14327db96d56Sopenharmony_ci     * the value ``None`` which will make the subprocess inherit the file
14337db96d56Sopenharmony_ci       descriptor from this process
14347db96d56Sopenharmony_ci     * the :const:`subprocess.DEVNULL` constant which indicates that the
14357db96d56Sopenharmony_ci       special :data:`os.devnull` file will be used
14367db96d56Sopenharmony_ci
14377db96d56Sopenharmony_ci   * *stderr* can be any of these:
14387db96d56Sopenharmony_ci
14397db96d56Sopenharmony_ci     * a file-like object representing a pipe to be connected to the
14407db96d56Sopenharmony_ci       subprocess's standard error stream using
14417db96d56Sopenharmony_ci       :meth:`~loop.connect_write_pipe`
14427db96d56Sopenharmony_ci     * the :const:`subprocess.PIPE` constant (default) which will create a new
14437db96d56Sopenharmony_ci       pipe and connect it,
14447db96d56Sopenharmony_ci     * the value ``None`` which will make the subprocess inherit the file
14457db96d56Sopenharmony_ci       descriptor from this process
14467db96d56Sopenharmony_ci     * the :const:`subprocess.DEVNULL` constant which indicates that the
14477db96d56Sopenharmony_ci       special :data:`os.devnull` file will be used
14487db96d56Sopenharmony_ci     * the :const:`subprocess.STDOUT` constant which will connect the standard
14497db96d56Sopenharmony_ci       error stream to the process' standard output stream
14507db96d56Sopenharmony_ci
14517db96d56Sopenharmony_ci   * All other keyword arguments are passed to :class:`subprocess.Popen`
14527db96d56Sopenharmony_ci     without interpretation, except for *bufsize*, *universal_newlines*,
14537db96d56Sopenharmony_ci     *shell*, *text*, *encoding* and *errors*, which should not be specified
14547db96d56Sopenharmony_ci     at all.
14557db96d56Sopenharmony_ci
14567db96d56Sopenharmony_ci     The ``asyncio`` subprocess API does not support decoding the streams
14577db96d56Sopenharmony_ci     as text. :func:`bytes.decode` can be used to convert the bytes returned
14587db96d56Sopenharmony_ci     from the stream to text.
14597db96d56Sopenharmony_ci
14607db96d56Sopenharmony_ci   See the constructor of the :class:`subprocess.Popen` class
14617db96d56Sopenharmony_ci   for documentation on other arguments.
14627db96d56Sopenharmony_ci
14637db96d56Sopenharmony_ci   Returns a pair of ``(transport, protocol)``, where *transport*
14647db96d56Sopenharmony_ci   conforms to the :class:`asyncio.SubprocessTransport` base class and
14657db96d56Sopenharmony_ci   *protocol* is an object instantiated by the *protocol_factory*.
14667db96d56Sopenharmony_ci
14677db96d56Sopenharmony_ci.. coroutinemethod:: loop.subprocess_shell(protocol_factory, cmd, *, \
14687db96d56Sopenharmony_ci                        stdin=subprocess.PIPE, stdout=subprocess.PIPE, \
14697db96d56Sopenharmony_ci                        stderr=subprocess.PIPE, **kwargs)
14707db96d56Sopenharmony_ci
14717db96d56Sopenharmony_ci   Create a subprocess from *cmd*, which can be a :class:`str` or a
14727db96d56Sopenharmony_ci   :class:`bytes` string encoded to the
14737db96d56Sopenharmony_ci   :ref:`filesystem encoding <filesystem-encoding>`,
14747db96d56Sopenharmony_ci   using the platform's "shell" syntax.
14757db96d56Sopenharmony_ci
14767db96d56Sopenharmony_ci   This is similar to the standard library :class:`subprocess.Popen`
14777db96d56Sopenharmony_ci   class called with ``shell=True``.
14787db96d56Sopenharmony_ci
14797db96d56Sopenharmony_ci   The *protocol_factory* must be a callable returning a subclass of the
14807db96d56Sopenharmony_ci   :class:`SubprocessProtocol` class.
14817db96d56Sopenharmony_ci
14827db96d56Sopenharmony_ci   See :meth:`~loop.subprocess_exec` for more details about
14837db96d56Sopenharmony_ci   the remaining arguments.
14847db96d56Sopenharmony_ci
14857db96d56Sopenharmony_ci   Returns a pair of ``(transport, protocol)``, where *transport*
14867db96d56Sopenharmony_ci   conforms to the :class:`SubprocessTransport` base class and
14877db96d56Sopenharmony_ci   *protocol* is an object instantiated by the *protocol_factory*.
14887db96d56Sopenharmony_ci
14897db96d56Sopenharmony_ci.. note::
14907db96d56Sopenharmony_ci   It is the application's responsibility to ensure that all whitespace
14917db96d56Sopenharmony_ci   and special characters are quoted appropriately to avoid `shell injection
14927db96d56Sopenharmony_ci   <https://en.wikipedia.org/wiki/Shell_injection#Shell_injection>`_
14937db96d56Sopenharmony_ci   vulnerabilities. The :func:`shlex.quote` function can be used to
14947db96d56Sopenharmony_ci   properly escape whitespace and special characters in strings that
14957db96d56Sopenharmony_ci   are going to be used to construct shell commands.
14967db96d56Sopenharmony_ci
14977db96d56Sopenharmony_ci
14987db96d56Sopenharmony_ciCallback Handles
14997db96d56Sopenharmony_ci================
15007db96d56Sopenharmony_ci
15017db96d56Sopenharmony_ci.. class:: Handle
15027db96d56Sopenharmony_ci
15037db96d56Sopenharmony_ci   A callback wrapper object returned by :meth:`loop.call_soon`,
15047db96d56Sopenharmony_ci   :meth:`loop.call_soon_threadsafe`.
15057db96d56Sopenharmony_ci
15067db96d56Sopenharmony_ci   .. method:: cancel()
15077db96d56Sopenharmony_ci
15087db96d56Sopenharmony_ci      Cancel the callback.  If the callback has already been canceled
15097db96d56Sopenharmony_ci      or executed, this method has no effect.
15107db96d56Sopenharmony_ci
15117db96d56Sopenharmony_ci   .. method:: cancelled()
15127db96d56Sopenharmony_ci
15137db96d56Sopenharmony_ci      Return ``True`` if the callback was cancelled.
15147db96d56Sopenharmony_ci
15157db96d56Sopenharmony_ci      .. versionadded:: 3.7
15167db96d56Sopenharmony_ci
15177db96d56Sopenharmony_ci.. class:: TimerHandle
15187db96d56Sopenharmony_ci
15197db96d56Sopenharmony_ci   A callback wrapper object returned by :meth:`loop.call_later`,
15207db96d56Sopenharmony_ci   and :meth:`loop.call_at`.
15217db96d56Sopenharmony_ci
15227db96d56Sopenharmony_ci   This class is a subclass of :class:`Handle`.
15237db96d56Sopenharmony_ci
15247db96d56Sopenharmony_ci   .. method:: when()
15257db96d56Sopenharmony_ci
15267db96d56Sopenharmony_ci      Return a scheduled callback time as :class:`float` seconds.
15277db96d56Sopenharmony_ci
15287db96d56Sopenharmony_ci      The time is an absolute timestamp, using the same time
15297db96d56Sopenharmony_ci      reference as :meth:`loop.time`.
15307db96d56Sopenharmony_ci
15317db96d56Sopenharmony_ci      .. versionadded:: 3.7
15327db96d56Sopenharmony_ci
15337db96d56Sopenharmony_ci
15347db96d56Sopenharmony_ciServer Objects
15357db96d56Sopenharmony_ci==============
15367db96d56Sopenharmony_ci
15377db96d56Sopenharmony_ciServer objects are created by :meth:`loop.create_server`,
15387db96d56Sopenharmony_ci:meth:`loop.create_unix_server`, :func:`start_server`,
15397db96d56Sopenharmony_ciand :func:`start_unix_server` functions.
15407db96d56Sopenharmony_ci
15417db96d56Sopenharmony_ciDo not instantiate the :class:`Server` class directly.
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_ci.. class:: Server
15447db96d56Sopenharmony_ci
15457db96d56Sopenharmony_ci   *Server* objects are asynchronous context managers.  When used in an
15467db96d56Sopenharmony_ci   ``async with`` statement, it's guaranteed that the Server object is
15477db96d56Sopenharmony_ci   closed and not accepting new connections when the ``async with``
15487db96d56Sopenharmony_ci   statement is completed::
15497db96d56Sopenharmony_ci
15507db96d56Sopenharmony_ci      srv = await loop.create_server(...)
15517db96d56Sopenharmony_ci
15527db96d56Sopenharmony_ci      async with srv:
15537db96d56Sopenharmony_ci          # some code
15547db96d56Sopenharmony_ci
15557db96d56Sopenharmony_ci      # At this point, srv is closed and no longer accepts new connections.
15567db96d56Sopenharmony_ci
15577db96d56Sopenharmony_ci
15587db96d56Sopenharmony_ci   .. versionchanged:: 3.7
15597db96d56Sopenharmony_ci      Server object is an asynchronous context manager since Python 3.7.
15607db96d56Sopenharmony_ci
15617db96d56Sopenharmony_ci   .. method:: close()
15627db96d56Sopenharmony_ci
15637db96d56Sopenharmony_ci      Stop serving: close listening sockets and set the :attr:`sockets`
15647db96d56Sopenharmony_ci      attribute to ``None``.
15657db96d56Sopenharmony_ci
15667db96d56Sopenharmony_ci      The sockets that represent existing incoming client connections
15677db96d56Sopenharmony_ci      are left open.
15687db96d56Sopenharmony_ci
15697db96d56Sopenharmony_ci      The server is closed asynchronously, use the :meth:`wait_closed`
15707db96d56Sopenharmony_ci      coroutine to wait until the server is closed.
15717db96d56Sopenharmony_ci
15727db96d56Sopenharmony_ci   .. method:: get_loop()
15737db96d56Sopenharmony_ci
15747db96d56Sopenharmony_ci      Return the event loop associated with the server object.
15757db96d56Sopenharmony_ci
15767db96d56Sopenharmony_ci      .. versionadded:: 3.7
15777db96d56Sopenharmony_ci
15787db96d56Sopenharmony_ci   .. coroutinemethod:: start_serving()
15797db96d56Sopenharmony_ci
15807db96d56Sopenharmony_ci      Start accepting connections.
15817db96d56Sopenharmony_ci
15827db96d56Sopenharmony_ci      This method is idempotent, so it can be called when
15837db96d56Sopenharmony_ci      the server is already serving.
15847db96d56Sopenharmony_ci
15857db96d56Sopenharmony_ci      The *start_serving* keyword-only parameter to
15867db96d56Sopenharmony_ci      :meth:`loop.create_server` and
15877db96d56Sopenharmony_ci      :meth:`asyncio.start_server` allows creating a Server object
15887db96d56Sopenharmony_ci      that is not accepting connections initially.  In this case
15897db96d56Sopenharmony_ci      ``Server.start_serving()``, or :meth:`Server.serve_forever` can be used
15907db96d56Sopenharmony_ci      to make the Server start accepting connections.
15917db96d56Sopenharmony_ci
15927db96d56Sopenharmony_ci      .. versionadded:: 3.7
15937db96d56Sopenharmony_ci
15947db96d56Sopenharmony_ci   .. coroutinemethod:: serve_forever()
15957db96d56Sopenharmony_ci
15967db96d56Sopenharmony_ci      Start accepting connections until the coroutine is cancelled.
15977db96d56Sopenharmony_ci      Cancellation of ``serve_forever`` task causes the server
15987db96d56Sopenharmony_ci      to be closed.
15997db96d56Sopenharmony_ci
16007db96d56Sopenharmony_ci      This method can be called if the server is already accepting
16017db96d56Sopenharmony_ci      connections.  Only one ``serve_forever`` task can exist per
16027db96d56Sopenharmony_ci      one *Server* object.
16037db96d56Sopenharmony_ci
16047db96d56Sopenharmony_ci      Example::
16057db96d56Sopenharmony_ci
16067db96d56Sopenharmony_ci          async def client_connected(reader, writer):
16077db96d56Sopenharmony_ci              # Communicate with the client with
16087db96d56Sopenharmony_ci              # reader/writer streams.  For example:
16097db96d56Sopenharmony_ci              await reader.readline()
16107db96d56Sopenharmony_ci
16117db96d56Sopenharmony_ci          async def main(host, port):
16127db96d56Sopenharmony_ci              srv = await asyncio.start_server(
16137db96d56Sopenharmony_ci                  client_connected, host, port)
16147db96d56Sopenharmony_ci              await srv.serve_forever()
16157db96d56Sopenharmony_ci
16167db96d56Sopenharmony_ci          asyncio.run(main('127.0.0.1', 0))
16177db96d56Sopenharmony_ci
16187db96d56Sopenharmony_ci      .. versionadded:: 3.7
16197db96d56Sopenharmony_ci
16207db96d56Sopenharmony_ci   .. method:: is_serving()
16217db96d56Sopenharmony_ci
16227db96d56Sopenharmony_ci      Return ``True`` if the server is accepting new connections.
16237db96d56Sopenharmony_ci
16247db96d56Sopenharmony_ci      .. versionadded:: 3.7
16257db96d56Sopenharmony_ci
16267db96d56Sopenharmony_ci   .. coroutinemethod:: wait_closed()
16277db96d56Sopenharmony_ci
16287db96d56Sopenharmony_ci      Wait until the :meth:`close` method completes.
16297db96d56Sopenharmony_ci
16307db96d56Sopenharmony_ci   .. attribute:: sockets
16317db96d56Sopenharmony_ci
16327db96d56Sopenharmony_ci      List of socket-like objects, ``asyncio.trsock.TransportSocket``, which
16337db96d56Sopenharmony_ci      the server is listening on.
16347db96d56Sopenharmony_ci
16357db96d56Sopenharmony_ci      .. versionchanged:: 3.7
16367db96d56Sopenharmony_ci         Prior to Python 3.7 ``Server.sockets`` used to return an
16377db96d56Sopenharmony_ci         internal list of server sockets directly.  In 3.7 a copy
16387db96d56Sopenharmony_ci         of that list is returned.
16397db96d56Sopenharmony_ci
16407db96d56Sopenharmony_ci
16417db96d56Sopenharmony_ci.. _asyncio-event-loops:
16427db96d56Sopenharmony_ci.. _asyncio-event-loop-implementations:
16437db96d56Sopenharmony_ci
16447db96d56Sopenharmony_ciEvent Loop Implementations
16457db96d56Sopenharmony_ci==========================
16467db96d56Sopenharmony_ci
16477db96d56Sopenharmony_ciasyncio ships with two different event loop implementations:
16487db96d56Sopenharmony_ci:class:`SelectorEventLoop` and :class:`ProactorEventLoop`.
16497db96d56Sopenharmony_ci
16507db96d56Sopenharmony_ciBy default asyncio is configured to use :class:`SelectorEventLoop`
16517db96d56Sopenharmony_cion Unix and :class:`ProactorEventLoop` on Windows.
16527db96d56Sopenharmony_ci
16537db96d56Sopenharmony_ci
16547db96d56Sopenharmony_ci.. class:: SelectorEventLoop
16557db96d56Sopenharmony_ci
16567db96d56Sopenharmony_ci   An event loop based on the :mod:`selectors` module.
16577db96d56Sopenharmony_ci
16587db96d56Sopenharmony_ci   Uses the most efficient *selector* available for the given
16597db96d56Sopenharmony_ci   platform.  It is also possible to manually configure the
16607db96d56Sopenharmony_ci   exact selector implementation to be used::
16617db96d56Sopenharmony_ci
16627db96d56Sopenharmony_ci      import asyncio
16637db96d56Sopenharmony_ci      import selectors
16647db96d56Sopenharmony_ci
16657db96d56Sopenharmony_ci      class MyPolicy(asyncio.DefaultEventLoopPolicy):
16667db96d56Sopenharmony_ci         def new_event_loop(self):
16677db96d56Sopenharmony_ci            selector = selectors.SelectSelector()
16687db96d56Sopenharmony_ci            return asyncio.SelectorEventLoop(selector)
16697db96d56Sopenharmony_ci
16707db96d56Sopenharmony_ci      asyncio.set_event_loop_policy(MyPolicy())
16717db96d56Sopenharmony_ci
16727db96d56Sopenharmony_ci
16737db96d56Sopenharmony_ci   .. availability:: Unix, Windows.
16747db96d56Sopenharmony_ci
16757db96d56Sopenharmony_ci
16767db96d56Sopenharmony_ci.. class:: ProactorEventLoop
16777db96d56Sopenharmony_ci
16787db96d56Sopenharmony_ci   An event loop for Windows that uses "I/O Completion Ports" (IOCP).
16797db96d56Sopenharmony_ci
16807db96d56Sopenharmony_ci   .. availability:: Windows.
16817db96d56Sopenharmony_ci
16827db96d56Sopenharmony_ci   .. seealso::
16837db96d56Sopenharmony_ci
16847db96d56Sopenharmony_ci      `MSDN documentation on I/O Completion Ports
16857db96d56Sopenharmony_ci      <https://docs.microsoft.com/en-ca/windows/desktop/FileIO/i-o-completion-ports>`_.
16867db96d56Sopenharmony_ci
16877db96d56Sopenharmony_ci
16887db96d56Sopenharmony_ci.. class:: AbstractEventLoop
16897db96d56Sopenharmony_ci
16907db96d56Sopenharmony_ci   Abstract base class for asyncio-compliant event loops.
16917db96d56Sopenharmony_ci
16927db96d56Sopenharmony_ci   The :ref:`asyncio-event-loop-methods` section lists all
16937db96d56Sopenharmony_ci   methods that an alternative implementation of ``AbstractEventLoop``
16947db96d56Sopenharmony_ci   should have defined.
16957db96d56Sopenharmony_ci
16967db96d56Sopenharmony_ci
16977db96d56Sopenharmony_ciExamples
16987db96d56Sopenharmony_ci========
16997db96d56Sopenharmony_ci
17007db96d56Sopenharmony_ciNote that all examples in this section **purposefully** show how
17017db96d56Sopenharmony_cito use the low-level event loop APIs, such as :meth:`loop.run_forever`
17027db96d56Sopenharmony_ciand :meth:`loop.call_soon`.  Modern asyncio applications rarely
17037db96d56Sopenharmony_cineed to be written this way; consider using the high-level functions
17047db96d56Sopenharmony_cilike :func:`asyncio.run`.
17057db96d56Sopenharmony_ci
17067db96d56Sopenharmony_ci
17077db96d56Sopenharmony_ci.. _asyncio_example_lowlevel_helloworld:
17087db96d56Sopenharmony_ci
17097db96d56Sopenharmony_ciHello World with call_soon()
17107db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^
17117db96d56Sopenharmony_ci
17127db96d56Sopenharmony_ciAn example using the :meth:`loop.call_soon` method to schedule a
17137db96d56Sopenharmony_cicallback. The callback displays ``"Hello World"`` and then stops the
17147db96d56Sopenharmony_cievent loop::
17157db96d56Sopenharmony_ci
17167db96d56Sopenharmony_ci    import asyncio
17177db96d56Sopenharmony_ci
17187db96d56Sopenharmony_ci    def hello_world(loop):
17197db96d56Sopenharmony_ci        """A callback to print 'Hello World' and stop the event loop"""
17207db96d56Sopenharmony_ci        print('Hello World')
17217db96d56Sopenharmony_ci        loop.stop()
17227db96d56Sopenharmony_ci
17237db96d56Sopenharmony_ci    loop = asyncio.new_event_loop()
17247db96d56Sopenharmony_ci
17257db96d56Sopenharmony_ci    # Schedule a call to hello_world()
17267db96d56Sopenharmony_ci    loop.call_soon(hello_world, loop)
17277db96d56Sopenharmony_ci
17287db96d56Sopenharmony_ci    # Blocking call interrupted by loop.stop()
17297db96d56Sopenharmony_ci    try:
17307db96d56Sopenharmony_ci        loop.run_forever()
17317db96d56Sopenharmony_ci    finally:
17327db96d56Sopenharmony_ci        loop.close()
17337db96d56Sopenharmony_ci
17347db96d56Sopenharmony_ci.. seealso::
17357db96d56Sopenharmony_ci
17367db96d56Sopenharmony_ci   A similar :ref:`Hello World <coroutine>`
17377db96d56Sopenharmony_ci   example created with a coroutine and the :func:`run` function.
17387db96d56Sopenharmony_ci
17397db96d56Sopenharmony_ci
17407db96d56Sopenharmony_ci.. _asyncio_example_call_later:
17417db96d56Sopenharmony_ci
17427db96d56Sopenharmony_ciDisplay the current date with call_later()
17437db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
17447db96d56Sopenharmony_ci
17457db96d56Sopenharmony_ciAn example of a callback displaying the current date every second. The
17467db96d56Sopenharmony_cicallback uses the :meth:`loop.call_later` method to reschedule itself
17477db96d56Sopenharmony_ciafter 5 seconds, and then stops the event loop::
17487db96d56Sopenharmony_ci
17497db96d56Sopenharmony_ci    import asyncio
17507db96d56Sopenharmony_ci    import datetime
17517db96d56Sopenharmony_ci
17527db96d56Sopenharmony_ci    def display_date(end_time, loop):
17537db96d56Sopenharmony_ci        print(datetime.datetime.now())
17547db96d56Sopenharmony_ci        if (loop.time() + 1.0) < end_time:
17557db96d56Sopenharmony_ci            loop.call_later(1, display_date, end_time, loop)
17567db96d56Sopenharmony_ci        else:
17577db96d56Sopenharmony_ci            loop.stop()
17587db96d56Sopenharmony_ci
17597db96d56Sopenharmony_ci    loop = asyncio.new_event_loop()
17607db96d56Sopenharmony_ci
17617db96d56Sopenharmony_ci    # Schedule the first call to display_date()
17627db96d56Sopenharmony_ci    end_time = loop.time() + 5.0
17637db96d56Sopenharmony_ci    loop.call_soon(display_date, end_time, loop)
17647db96d56Sopenharmony_ci
17657db96d56Sopenharmony_ci    # Blocking call interrupted by loop.stop()
17667db96d56Sopenharmony_ci    try:
17677db96d56Sopenharmony_ci        loop.run_forever()
17687db96d56Sopenharmony_ci    finally:
17697db96d56Sopenharmony_ci        loop.close()
17707db96d56Sopenharmony_ci
17717db96d56Sopenharmony_ci.. seealso::
17727db96d56Sopenharmony_ci
17737db96d56Sopenharmony_ci   A similar :ref:`current date <asyncio_example_sleep>` example
17747db96d56Sopenharmony_ci   created with a coroutine and the :func:`run` function.
17757db96d56Sopenharmony_ci
17767db96d56Sopenharmony_ci
17777db96d56Sopenharmony_ci.. _asyncio_example_watch_fd:
17787db96d56Sopenharmony_ci
17797db96d56Sopenharmony_ciWatch a file descriptor for read events
17807db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
17817db96d56Sopenharmony_ci
17827db96d56Sopenharmony_ciWait until a file descriptor received some data using the
17837db96d56Sopenharmony_ci:meth:`loop.add_reader` method and then close the event loop::
17847db96d56Sopenharmony_ci
17857db96d56Sopenharmony_ci    import asyncio
17867db96d56Sopenharmony_ci    from socket import socketpair
17877db96d56Sopenharmony_ci
17887db96d56Sopenharmony_ci    # Create a pair of connected file descriptors
17897db96d56Sopenharmony_ci    rsock, wsock = socketpair()
17907db96d56Sopenharmony_ci
17917db96d56Sopenharmony_ci    loop = asyncio.new_event_loop()
17927db96d56Sopenharmony_ci
17937db96d56Sopenharmony_ci    def reader():
17947db96d56Sopenharmony_ci        data = rsock.recv(100)
17957db96d56Sopenharmony_ci        print("Received:", data.decode())
17967db96d56Sopenharmony_ci
17977db96d56Sopenharmony_ci        # We are done: unregister the file descriptor
17987db96d56Sopenharmony_ci        loop.remove_reader(rsock)
17997db96d56Sopenharmony_ci
18007db96d56Sopenharmony_ci        # Stop the event loop
18017db96d56Sopenharmony_ci        loop.stop()
18027db96d56Sopenharmony_ci
18037db96d56Sopenharmony_ci    # Register the file descriptor for read event
18047db96d56Sopenharmony_ci    loop.add_reader(rsock, reader)
18057db96d56Sopenharmony_ci
18067db96d56Sopenharmony_ci    # Simulate the reception of data from the network
18077db96d56Sopenharmony_ci    loop.call_soon(wsock.send, 'abc'.encode())
18087db96d56Sopenharmony_ci
18097db96d56Sopenharmony_ci    try:
18107db96d56Sopenharmony_ci        # Run the event loop
18117db96d56Sopenharmony_ci        loop.run_forever()
18127db96d56Sopenharmony_ci    finally:
18137db96d56Sopenharmony_ci        # We are done. Close sockets and the event loop.
18147db96d56Sopenharmony_ci        rsock.close()
18157db96d56Sopenharmony_ci        wsock.close()
18167db96d56Sopenharmony_ci        loop.close()
18177db96d56Sopenharmony_ci
18187db96d56Sopenharmony_ci.. seealso::
18197db96d56Sopenharmony_ci
18207db96d56Sopenharmony_ci   * A similar :ref:`example <asyncio_example_create_connection>`
18217db96d56Sopenharmony_ci     using transports, protocols, and the
18227db96d56Sopenharmony_ci     :meth:`loop.create_connection` method.
18237db96d56Sopenharmony_ci
18247db96d56Sopenharmony_ci   * Another similar :ref:`example <asyncio_example_create_connection-streams>`
18257db96d56Sopenharmony_ci     using the high-level :func:`asyncio.open_connection` function
18267db96d56Sopenharmony_ci     and streams.
18277db96d56Sopenharmony_ci
18287db96d56Sopenharmony_ci
18297db96d56Sopenharmony_ci.. _asyncio_example_unix_signals:
18307db96d56Sopenharmony_ci
18317db96d56Sopenharmony_ciSet signal handlers for SIGINT and SIGTERM
18327db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
18337db96d56Sopenharmony_ci
18347db96d56Sopenharmony_ci(This ``signals`` example only works on Unix.)
18357db96d56Sopenharmony_ci
18367db96d56Sopenharmony_ciRegister handlers for signals :py:data:`SIGINT` and :py:data:`SIGTERM`
18377db96d56Sopenharmony_ciusing the :meth:`loop.add_signal_handler` method::
18387db96d56Sopenharmony_ci
18397db96d56Sopenharmony_ci    import asyncio
18407db96d56Sopenharmony_ci    import functools
18417db96d56Sopenharmony_ci    import os
18427db96d56Sopenharmony_ci    import signal
18437db96d56Sopenharmony_ci
18447db96d56Sopenharmony_ci    def ask_exit(signame, loop):
18457db96d56Sopenharmony_ci        print("got signal %s: exit" % signame)
18467db96d56Sopenharmony_ci        loop.stop()
18477db96d56Sopenharmony_ci
18487db96d56Sopenharmony_ci    async def main():
18497db96d56Sopenharmony_ci        loop = asyncio.get_running_loop()
18507db96d56Sopenharmony_ci
18517db96d56Sopenharmony_ci        for signame in {'SIGINT', 'SIGTERM'}:
18527db96d56Sopenharmony_ci            loop.add_signal_handler(
18537db96d56Sopenharmony_ci                getattr(signal, signame),
18547db96d56Sopenharmony_ci                functools.partial(ask_exit, signame, loop))
18557db96d56Sopenharmony_ci
18567db96d56Sopenharmony_ci        await asyncio.sleep(3600)
18577db96d56Sopenharmony_ci
18587db96d56Sopenharmony_ci    print("Event loop running for 1 hour, press Ctrl+C to interrupt.")
18597db96d56Sopenharmony_ci    print(f"pid {os.getpid()}: send SIGINT or SIGTERM to exit.")
18607db96d56Sopenharmony_ci
18617db96d56Sopenharmony_ci    asyncio.run(main())
1862