| 
									
										
										
										
											2013-12-20 14:37:39 -05:00
										 |  |  | .. currentmodule:: asyncio
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  | .. _asyncio-event-loop:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | ==========
 | 
					
						
							|  |  |  | Event Loop
 | 
					
						
							|  |  |  | ==========
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 19:18:46 -04:00
										 |  |  | **Source code:** :source:`Lib/asyncio/events.py`,
 | 
					
						
							|  |  |  | :source:`Lib/asyncio/base_events.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ------------------------------------
 | 
					
						
							| 
									
										
										
										
											2017-07-25 17:03:51 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. rubric:: Preface
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | The event loop is the core of every asyncio application.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Event loops run asynchronous tasks and callbacks, perform network
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  | IO operations, and run subprocesses.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | Application developers should typically use the high-level asyncio functions,
 | 
					
						
							|  |  |  | such as :func:`asyncio.run`, and should rarely need to reference the loop
 | 
					
						
							|  |  |  | object or call its methods.  This section is intended mostly for authors
 | 
					
						
							|  |  |  | of lower-level code, libraries, and frameworks, who need finer control over
 | 
					
						
							|  |  |  | the event loop behavior.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | .. rubric:: Obtaining the Event Loop
 | 
					
						
							| 
									
										
										
										
											2014-02-09 06:55:58 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | The following low-level functions can be used to get, set, or create
 | 
					
						
							|  |  |  | an event loop:
 | 
					
						
							| 
									
										
										
										
											2016-08-08 09:41:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. function:: get_running_loop()
 | 
					
						
							| 
									
										
										
										
											2016-08-08 09:41:21 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Return the running event loop in the current OS thread.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-03 19:48:41 -05:00
										 |  |  |    Raise a :exc:`RuntimeError` if there is no running event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    This function can only be called from a coroutine or a callback.
 | 
					
						
							| 
									
										
										
										
											2015-02-25 14:24:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    .. versionadded:: 3.7
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. function:: get_event_loop()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 00:46:38 +02:00
										 |  |  |    Get the current event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-06 19:42:12 +02:00
										 |  |  |    When called from a coroutine or a callback (e.g. scheduled with
 | 
					
						
							|  |  |  |    call_soon or similar API), this function will always return the
 | 
					
						
							|  |  |  |    running event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If there is no running event loop set, the function will return
 | 
					
						
							| 
									
										
										
										
											2023-01-13 14:40:29 +02:00
										 |  |  |    the result of the ``get_event_loop_policy().get_event_loop()`` call.
 | 
					
						
							| 
									
										
										
										
											2015-11-19 13:28:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    Because this function has rather complex behavior (especially
 | 
					
						
							|  |  |  |    when custom event loop policies are in use), using the
 | 
					
						
							|  |  |  |    :func:`get_running_loop` function is preferred to :func:`get_event_loop`
 | 
					
						
							|  |  |  |    in coroutines and callbacks.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-03 19:48:41 -05:00
										 |  |  |    As noted above, consider using the higher-level :func:`asyncio.run` function,
 | 
					
						
							|  |  |  |    instead of using these lower level functions to manually create and close an
 | 
					
						
							|  |  |  |    event loop.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 14:21:20 +05:30
										 |  |  |    .. versionchanged:: 3.14
 | 
					
						
							|  |  |  |       Raises a :exc:`RuntimeError` if there is no current event loop.
 | 
					
						
							| 
									
										
										
										
											2021-04-25 13:40:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 20:43:41 +05:30
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The :mod:`!asyncio` policy system is deprecated and will be removed
 | 
					
						
							|  |  |  |       in Python 3.16; from there on, this function will always return the
 | 
					
						
							|  |  |  |       running event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. function:: set_event_loop(loop)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-03 19:48:41 -05:00
										 |  |  |    Set *loop* as the current event loop for the current OS thread.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-14 13:41:39 +02:00
										 |  |  |    .. deprecated:: 3.14
 | 
					
						
							| 
									
										
										
										
											2024-12-24 19:24:28 +05:30
										 |  |  |       The :func:`set_event_loop` function is deprecated and will be removed
 | 
					
						
							|  |  |  |       in Python 3.16.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. function:: new_event_loop()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-13 04:39:22 -08:00
										 |  |  |    Create and return a new event loop object.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Note that the behaviour of :func:`get_event_loop`, :func:`set_event_loop`,
 | 
					
						
							|  |  |  | and :func:`new_event_loop` functions can be altered by
 | 
					
						
							|  |  |  | :ref:`setting a custom event loop policy <asyncio-policies>`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. rubric:: Contents
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | This documentation page contains the following sections:
 | 
					
						
							| 
									
										
										
										
											2015-11-19 13:28:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  | * The `Event Loop Methods`_ section is the reference documentation of
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |   the event loop APIs;
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | * The `Callback Handles`_ section documents the :class:`Handle` and
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |   :class:`TimerHandle` instances which are returned from scheduling
 | 
					
						
							|  |  |  |   methods such as :meth:`loop.call_soon` and :meth:`loop.call_later`;
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | * The `Server Objects`_ section documents types returned from
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |   event loop methods like :meth:`loop.create_server`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | * The `Event Loop Implementations`_ section documents the
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |   :class:`SelectorEventLoop` and :class:`ProactorEventLoop` classes;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * The `Examples`_ section showcases how to work with some event
 | 
					
						
							|  |  |  |   loop APIs.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  | .. _asyncio-event-loop-methods:
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | Event Loop Methods
 | 
					
						
							|  |  |  | ==================
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  | Event loops have **low-level** APIs for the following:
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. contents::
 | 
					
						
							|  |  |  |    :depth: 1
 | 
					
						
							|  |  |  |    :local: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Running and stopping the loop
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: loop.run_until_complete(future)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Run until the *future* (an instance of :class:`Future`) has
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    completed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If the argument is a :ref:`coroutine object <coroutine>` it
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    is implicitly scheduled to run as a :class:`asyncio.Task`.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Return the Future's result or raise its exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: loop.run_forever()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Run the event loop until :meth:`stop` is called.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-01 12:59:42 +08:00
										 |  |  |    If :meth:`stop` is called before :meth:`run_forever` is called,
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    the loop will poll the I/O selector once with a timeout of zero,
 | 
					
						
							|  |  |  |    run all callbacks scheduled in response to I/O events (and
 | 
					
						
							|  |  |  |    those that were already scheduled), and then exit.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If :meth:`stop` is called while :meth:`run_forever` is running,
 | 
					
						
							|  |  |  |    the loop will run the current batch of callbacks and then exit.
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Note that new callbacks scheduled by callbacks will not run in this
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    case; instead, they will run the next time :meth:`run_forever` or
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :meth:`run_until_complete` is called.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.stop()
 | 
					
						
							| 
									
										
										
										
											2014-06-10 10:23:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Stop the event loop.
 | 
					
						
							| 
									
										
										
										
											2014-06-10 10:23:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.is_running()
 | 
					
						
							| 
									
										
										
										
											2014-06-10 10:23:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Return ``True`` if the event loop is currently running.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.is_closed()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Return ``True`` if the event loop was closed.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.close()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Close the event loop.
 | 
					
						
							| 
									
										
										
										
											2016-12-15 17:36:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 23:39:21 +02:00
										 |  |  |    The loop must not be running when this function is called.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Any pending callbacks will be discarded.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-04 13:03:20 +02:00
										 |  |  |    This method clears all queues and shuts down the executor, but does
 | 
					
						
							|  |  |  |    not wait for the executor to finish.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This method is idempotent and irreversible.  No other methods
 | 
					
						
							|  |  |  |    should be called after the event loop is closed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. coroutinemethod:: loop.shutdown_asyncgens()
 | 
					
						
							| 
									
										
										
										
											2016-12-15 17:36:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Schedule all currently open :term:`asynchronous generator` objects to
 | 
					
						
							| 
									
										
										
										
											2024-09-01 12:59:42 +08:00
										 |  |  |    close with an :meth:`~agen.aclose` call.  After calling this method,
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    the event loop will issue a warning if a new asynchronous generator
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    is iterated. This should be used to reliably finalize all scheduled
 | 
					
						
							| 
									
										
										
										
											2018-09-17 23:58:00 -04:00
										 |  |  |    asynchronous generators.
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 23:58:00 -04:00
										 |  |  |    Note that there is no need to call this function when
 | 
					
						
							|  |  |  |    :func:`asyncio.run` is used.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Example::
 | 
					
						
							| 
									
										
										
										
											2016-12-15 17:36:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     try:
 | 
					
						
							|  |  |  |         loop.run_forever()
 | 
					
						
							|  |  |  |     finally:
 | 
					
						
							|  |  |  |         loop.run_until_complete(loop.shutdown_asyncgens())
 | 
					
						
							|  |  |  |         loop.close()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.6
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 23:09:42 +05:30
										 |  |  | .. coroutinemethod:: loop.shutdown_default_executor(timeout=None)
 | 
					
						
							| 
									
										
										
										
											2019-09-19 08:47:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Schedule the closure of the default executor and wait for it to join all of
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    the threads in the :class:`~concurrent.futures.ThreadPoolExecutor`.
 | 
					
						
							|  |  |  |    Once this method has been called,
 | 
					
						
							|  |  |  |    using the default executor with :meth:`loop.run_in_executor`
 | 
					
						
							|  |  |  |    will raise a :exc:`RuntimeError`.
 | 
					
						
							| 
									
										
										
										
											2019-09-19 08:47:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    The *timeout* parameter specifies the amount of time
 | 
					
						
							|  |  |  |    (in :class:`float` seconds) the executor will be given to finish joining.
 | 
					
						
							|  |  |  |    With the default, ``None``,
 | 
					
						
							|  |  |  |    the executor is allowed an unlimited amount of time.
 | 
					
						
							| 
									
										
										
										
											2022-09-28 23:09:42 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    If the *timeout* is reached, a :exc:`RuntimeWarning` is emitted
 | 
					
						
							|  |  |  |    and the default executor is terminated
 | 
					
						
							|  |  |  |    without waiting for its threads to finish joining.
 | 
					
						
							| 
									
										
										
										
											2022-09-28 23:09:42 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Do not call this method when using :func:`asyncio.run`,
 | 
					
						
							|  |  |  |       as the latter handles default executor shutdown automatically.
 | 
					
						
							| 
									
										
										
										
											2019-09-19 08:47:22 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.9
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 23:09:42 +05:30
										 |  |  |    .. versionchanged:: 3.12
 | 
					
						
							|  |  |  |       Added the *timeout* parameter.
 | 
					
						
							| 
									
										
										
										
											2016-12-15 17:36:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Scheduling callbacks
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.call_soon(callback, *args, context=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-22 22:16:00 -04:00
										 |  |  |    Schedule the *callback* :term:`callback` to be called with
 | 
					
						
							|  |  |  |    *args* arguments at the next iteration of the event loop.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    Return an instance of :class:`asyncio.Handle`,
 | 
					
						
							|  |  |  |    which can be used later to cancel the callback.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Callbacks are called in the order in which they are registered.
 | 
					
						
							|  |  |  |    Each callback will be called exactly once.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    The optional keyword-only *context* argument specifies a
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    custom :class:`contextvars.Context` for the *callback* to run in.
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    Callbacks use the current context when no *context* is provided.
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    Unlike :meth:`call_soon_threadsafe`, this method is not thread-safe.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.call_soon_threadsafe(callback, *args, context=None)
 | 
					
						
							| 
									
										
										
										
											2014-11-28 13:15:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 00:25:42 -05:00
										 |  |  |    A thread-safe variant of :meth:`call_soon`. When scheduling callbacks from
 | 
					
						
							|  |  |  |    another thread, this function *must* be used, since :meth:`call_soon` is not
 | 
					
						
							|  |  |  |    thread-safe.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 14:49:05 +05:30
										 |  |  |    This function is safe to be called from a reentrant context or signal handler,
 | 
					
						
							|  |  |  |    however, it is not safe or fruitful to use the returned handle in such contexts.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-18 06:55:04 +08:00
										 |  |  |    Raises :exc:`RuntimeError` if called on a loop that's been closed.
 | 
					
						
							|  |  |  |    This can happen on a secondary thread when the main application is
 | 
					
						
							|  |  |  |    shutting down.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-25 14:24:15 +01:00
										 |  |  |    See the :ref:`concurrency and multithreading <asyncio-multithreading>`
 | 
					
						
							|  |  |  |    section of the documentation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-22 20:11:57 +03:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       The *context* keyword-only parameter was added. See :pep:`567`
 | 
					
						
							|  |  |  |       for more details.
 | 
					
						
							| 
									
										
										
										
											2018-05-23 13:35:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | .. _asyncio-pass-keywords:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. note::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    Most :mod:`asyncio` scheduling functions don't allow passing
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    keyword arguments.  To do that, use :func:`functools.partial`::
 | 
					
						
							| 
									
										
										
										
											2014-02-01 02:36:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |       # will schedule "print("Hello", flush=True)"
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       loop.call_soon(
 | 
					
						
							|  |  |  |           functools.partial(print, "Hello", flush=True))
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Using partial objects is usually more convenient than using lambdas,
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    as asyncio can render partial objects better in debug and error
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    messages.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-01 02:36:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. _asyncio-delayed-calls:
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Scheduling delayed callbacks
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Event loop provides mechanisms to schedule callback functions
 | 
					
						
							|  |  |  | to be called at some point in the future.  Event loop uses monotonic
 | 
					
						
							|  |  |  | clocks to track time.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: loop.call_later(delay, callback, *args, context=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Schedule *callback* to be called after the given *delay*
 | 
					
						
							|  |  |  |    number of seconds (can be either an int or a float).
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    An instance of :class:`asyncio.TimerHandle` is returned which can
 | 
					
						
							|  |  |  |    be used to cancel the callback.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    *callback* will be called exactly once.  If two callbacks are
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    scheduled for exactly the same time, the order in which they
 | 
					
						
							|  |  |  |    are called is undefined.
 | 
					
						
							| 
									
										
										
										
											2018-05-23 13:35:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    The optional positional *args* will be passed to the callback when
 | 
					
						
							|  |  |  |    it is called. If you want the callback to be called with keyword
 | 
					
						
							|  |  |  |    arguments use :func:`functools.partial`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An optional keyword-only *context* argument allows specifying a
 | 
					
						
							|  |  |  |    custom :class:`contextvars.Context` for the *callback* to run in.
 | 
					
						
							|  |  |  |    The current context is used when no *context* is provided.
 | 
					
						
							| 
									
										
										
										
											2014-11-28 13:15:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-23 13:35:04 -04:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       The *context* keyword-only parameter was added. See :pep:`567`
 | 
					
						
							|  |  |  |       for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  |       In Python 3.7 and earlier with the default event loop implementation,
 | 
					
						
							|  |  |  |       the *delay* could not exceed one day.
 | 
					
						
							|  |  |  |       This has been fixed in Python 3.8.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.call_at(when, callback, *args, context=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Schedule *callback* to be called at the given absolute timestamp
 | 
					
						
							|  |  |  |    *when* (an int or a float), using the same time reference as
 | 
					
						
							|  |  |  |    :meth:`loop.time`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This method's behavior is the same as :meth:`call_later`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    An instance of :class:`asyncio.TimerHandle` is returned which can
 | 
					
						
							|  |  |  |    be used to cancel the callback.
 | 
					
						
							| 
									
										
										
										
											2014-11-28 13:15:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-23 13:35:04 -04:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       The *context* keyword-only parameter was added. See :pep:`567`
 | 
					
						
							|  |  |  |       for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  |       In Python 3.7 and earlier with the default event loop implementation,
 | 
					
						
							|  |  |  |       the difference between *when* and the current time could not exceed
 | 
					
						
							|  |  |  |       one day.  This has been fixed in Python 3.8.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.time()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Return the current time, as a :class:`float` value, according to
 | 
					
						
							|  |  |  |    the event loop's internal monotonic clock.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. note::
 | 
					
						
							| 
									
										
										
										
											2019-04-18 14:43:14 +02:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  |       In Python 3.7 and earlier timeouts (relative *delay* or absolute *when*)
 | 
					
						
							|  |  |  |       should not exceed one day.  This has been fixed in Python 3.8.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:22:06 +01:00
										 |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The :func:`asyncio.sleep` function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Creating Futures and Tasks
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.create_future()
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-23 15:55:12 +05:30
										 |  |  |    Create an :class:`asyncio.Future` object attached to the event loop.
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    This is the preferred way to create Futures in asyncio. This lets
 | 
					
						
							|  |  |  |    third-party event loops provide alternative implementations of
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    the Future object (with better performance or instrumentation).
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  | .. method:: loop.create_task(coro, *, name=None, context=None)
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 15:59:27 +02:00
										 |  |  |    Schedule the execution of :ref:`coroutine <coroutine>` *coro*.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Return a :class:`Task` object.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Third-party event loops can use their own subclass of :class:`Task`
 | 
					
						
							|  |  |  |    for interoperability. In this case, the result type is a subclass
 | 
					
						
							|  |  |  |    of :class:`Task`.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    If the *name* argument is provided and not ``None``, it is set as
 | 
					
						
							|  |  |  |    the name of the task using :meth:`Task.set_name`.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |    An optional keyword-only *context* argument allows specifying a
 | 
					
						
							|  |  |  |    custom :class:`contextvars.Context` for the *coro* to run in.
 | 
					
						
							|  |  |  |    The current context copy is created when no *context* is provided.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       Added the *name* parameter.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added the *context* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.set_task_factory(factory)
 | 
					
						
							| 
									
										
										
										
											2015-05-11 16:28:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Set a task factory that will be used by
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :meth:`loop.create_task`.
 | 
					
						
							| 
									
										
										
										
											2015-05-11 16:28:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    If *factory* is ``None`` the default task factory will be set.
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Otherwise, *factory* must be a *callable* with the signature matching
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |    ``(loop, coro, context=None)``, where *loop* is a reference to the active
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    event loop, and *coro* is a coroutine object.  The callable
 | 
					
						
							|  |  |  |    must return a :class:`asyncio.Future`-compatible object.
 | 
					
						
							| 
									
										
										
										
											2015-05-11 16:28:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.get_task_factory()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return a task factory or ``None`` if the default one is in use.
 | 
					
						
							| 
									
										
										
										
											2015-05-11 16:28:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Opening network connections
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2015-05-11 16:28:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.create_connection(protocol_factory, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                           host=None, port=None, *, ssl=None, \
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                           family=0, proto=0, flags=0, sock=None, \
 | 
					
						
							|  |  |  |                           local_addr=None, server_hostname=None, \
 | 
					
						
							| 
									
										
										
										
											2020-02-10 04:48:40 -05:00
										 |  |  |                           ssl_handshake_timeout=None, \
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |                           ssl_shutdown_timeout=None, \
 | 
					
						
							| 
									
										
										
										
											2022-09-04 18:33:50 -07:00
										 |  |  |                           happy_eyeballs_delay=None, interleave=None, \
 | 
					
						
							|  |  |  |                           all_errors=False)
 | 
					
						
							| 
									
										
										
										
											2015-05-11 16:28:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Open a streaming transport connection to a given
 | 
					
						
							|  |  |  |    address specified by *host* and *port*.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |    The socket family can be either :py:const:`~socket.AF_INET` or
 | 
					
						
							|  |  |  |    :py:const:`~socket.AF_INET6` depending on *host* (or the *family*
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    argument, if provided).
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |    The socket type will be :py:const:`~socket.SOCK_STREAM`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    *protocol_factory* must be a callable returning an
 | 
					
						
							|  |  |  |    :ref:`asyncio protocol <asyncio-protocol>` implementation.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 20:53:26 -05:00
										 |  |  |    This method will try to establish the connection in the background.
 | 
					
						
							|  |  |  |    When successful, it returns a ``(transport, protocol)`` pair.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The chronological synopsis of the underlying operation is as follows:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    #. The connection is established and a :ref:`transport <asyncio-transport>`
 | 
					
						
							|  |  |  |       is created for it.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    #. *protocol_factory* is called without arguments and is expected to
 | 
					
						
							|  |  |  |       return a :ref:`protocol <asyncio-protocol>` instance.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    #. The protocol instance is coupled with the transport by calling its
 | 
					
						
							|  |  |  |       :meth:`~BaseProtocol.connection_made` method.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    #. A ``(transport, protocol)`` tuple is returned on success.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    The created transport is an implementation-dependent bidirectional
 | 
					
						
							|  |  |  |    stream.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Other arguments:
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    * *ssl*: if given and not false, a SSL/TLS transport is created
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |      (by default a plain TCP transport is created).  If *ssl* is
 | 
					
						
							|  |  |  |      a :class:`ssl.SSLContext` object, this context is used to create
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |      the transport; if *ssl* is :const:`True`, a default context returned
 | 
					
						
							|  |  |  |      from :func:`ssl.create_default_context` is used.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-28 00:00:58 +03:00
										 |  |  |      .. seealso:: :ref:`SSL/TLS security considerations <ssl-security>`
 | 
					
						
							| 
									
										
										
										
											2014-03-22 18:19:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    * *server_hostname* sets or overrides the hostname that the target
 | 
					
						
							|  |  |  |      server's certificate will be matched against.  Should only be passed
 | 
					
						
							|  |  |  |      if *ssl* is not ``None``.  By default the value of the *host* argument
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |      is used.  If *host* is empty, there is no default and you must pass a
 | 
					
						
							|  |  |  |      value for *server_hostname*.  If *server_hostname* is an empty
 | 
					
						
							|  |  |  |      string, hostname matching is disabled (which is a serious security
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |      risk, allowing for potential man-in-the-middle attacks).
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * *family*, *proto*, *flags* are the optional address family, protocol
 | 
					
						
							|  |  |  |      and flags to be passed through to getaddrinfo() for *host* resolution.
 | 
					
						
							|  |  |  |      If given, these should all be integers from the corresponding
 | 
					
						
							|  |  |  |      :mod:`socket` module constants.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-05 19:14:35 +08:00
										 |  |  |    * *happy_eyeballs_delay*, if given, enables Happy Eyeballs for this
 | 
					
						
							|  |  |  |      connection. It should
 | 
					
						
							|  |  |  |      be a floating-point number representing the amount of time in seconds
 | 
					
						
							|  |  |  |      to wait for a connection attempt to complete, before starting the next
 | 
					
						
							|  |  |  |      attempt in parallel. This is the "Connection Attempt Delay" as defined
 | 
					
						
							|  |  |  |      in :rfc:`8305`. A sensible default value recommended by the RFC is ``0.25``
 | 
					
						
							|  |  |  |      (250 milliseconds).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *interleave* controls address reordering when a host name resolves to
 | 
					
						
							|  |  |  |      multiple IP addresses.
 | 
					
						
							|  |  |  |      If ``0`` or unspecified, no reordering is done, and addresses are
 | 
					
						
							|  |  |  |      tried in the order returned by :meth:`getaddrinfo`. If a positive integer
 | 
					
						
							|  |  |  |      is specified, the addresses are interleaved by address family, and the
 | 
					
						
							|  |  |  |      given integer is interpreted as "First Address Family Count" as defined
 | 
					
						
							|  |  |  |      in :rfc:`8305`. The default is ``0`` if *happy_eyeballs_delay* is not
 | 
					
						
							|  |  |  |      specified, and ``1`` if it is.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |    * *sock*, if given, should be an existing, already connected
 | 
					
						
							|  |  |  |      :class:`socket.socket` object to be used by the transport.
 | 
					
						
							| 
									
										
										
										
											2019-05-05 19:14:35 +08:00
										 |  |  |      If *sock* is given, none of *host*, *port*, *family*, *proto*, *flags*,
 | 
					
						
							|  |  |  |      *happy_eyeballs_delay*, *interleave*
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |      and *local_addr* should be specified.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 16:42:01 -07:00
										 |  |  |      .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The *sock* argument transfers ownership of the socket to the
 | 
					
						
							|  |  |  |         transport created. To close the socket, call the transport's
 | 
					
						
							|  |  |  |         :meth:`~asyncio.BaseTransport.close` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |    * *local_addr*, if given, is a ``(local_host, local_port)`` tuple used
 | 
					
						
							| 
									
										
										
										
											2021-05-19 18:18:42 -03:00
										 |  |  |      to bind the socket locally.  The *local_host* and *local_port*
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |      are looked up using ``getaddrinfo()``, similarly to *host* and *port*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    * *ssl_handshake_timeout* is (for a TLS connection) the time in seconds
 | 
					
						
							|  |  |  |      to wait for the TLS handshake to complete before aborting the connection.
 | 
					
						
							| 
									
										
										
										
											2018-06-04 11:32:35 -04:00
										 |  |  |      ``60.0`` seconds if ``None`` (default).
 | 
					
						
							| 
									
										
										
										
											2017-12-19 19:45:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
 | 
					
						
							|  |  |  |      to complete before aborting the connection. ``30.0`` seconds if ``None``
 | 
					
						
							|  |  |  |      (default).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-04 18:33:50 -07:00
										 |  |  |    * *all_errors* determines what exceptions are raised when a connection cannot
 | 
					
						
							|  |  |  |      be created. By default, only a single ``Exception`` is raised: the first
 | 
					
						
							|  |  |  |      exception if there is only one or all errors have same message, or a single
 | 
					
						
							|  |  |  |      ``OSError`` with the error messages combined. When ``all_errors`` is ``True``,
 | 
					
						
							|  |  |  |      an ``ExceptionGroup`` will be raised containing all exceptions (even if there
 | 
					
						
							|  |  |  |      is only one).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.5
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added support for SSL/TLS in :class:`ProactorEventLoop`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.6
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-29 22:31:01 +03:00
										 |  |  |       The socket option :ref:`socket.TCP_NODELAY <socket-unix-constants>` is set by default
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       for all TCP connections.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *ssl_handshake_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.8
 | 
					
						
							| 
									
										
										
										
											2019-05-05 19:14:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-10 04:48:40 -05:00
										 |  |  |       Added the *happy_eyeballs_delay* and *interleave* parameters.
 | 
					
						
							| 
									
										
										
										
											2019-05-05 19:14:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-24 09:59:40 -05:00
										 |  |  |       Happy Eyeballs Algorithm: Success with Dual-Stack Hosts.
 | 
					
						
							|  |  |  |       When a server's IPv4 path and protocol are working, but the server's
 | 
					
						
							|  |  |  |       IPv6 path and protocol are not working, a dual-stack client
 | 
					
						
							|  |  |  |       application experiences significant connection delay compared to an
 | 
					
						
							| 
									
										
										
										
											2023-02-25 05:21:32 -08:00
										 |  |  |       IPv4-only client.  This is undesirable because it causes the
 | 
					
						
							|  |  |  |       dual-stack client to have a worse user experience.  This document
 | 
					
						
							| 
									
										
										
										
											2020-02-24 09:59:40 -05:00
										 |  |  |       specifies requirements for algorithms that reduce this user-visible
 | 
					
						
							|  |  |  |       delay and provides an algorithm.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-02 03:34:44 -03:00
										 |  |  |       For more information: https://datatracker.ietf.org/doc/html/rfc6555
 | 
					
						
							| 
									
										
										
										
											2020-02-24 09:59:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-04 18:33:50 -07:00
										 |  |  |    .. versionchanged:: 3.12
 | 
					
						
							|  |  |  |       *all_errors* was added.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:02:09 +01:00
										 |  |  |    .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       The :func:`open_connection` function is a high-level alternative
 | 
					
						
							|  |  |  |       API.  It returns a pair of (:class:`StreamReader`, :class:`StreamWriter`)
 | 
					
						
							|  |  |  |       that can be used directly in async/await code.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:02:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.create_datagram_endpoint(protocol_factory, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                         local_addr=None, remote_addr=None, *, \
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                         family=0, proto=0, flags=0, \
 | 
					
						
							| 
									
										
										
										
											2021-09-08 19:58:43 +03:00
										 |  |  |                         reuse_port=None, \
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                         allow_broadcast=None, sock=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Create a datagram connection.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |    The socket family can be either :py:const:`~socket.AF_INET`,
 | 
					
						
							|  |  |  |    :py:const:`~socket.AF_INET6`, or :py:const:`~socket.AF_UNIX`,
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    depending on *host* (or the *family* argument, if provided).
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |    The socket type will be :py:const:`~socket.SOCK_DGRAM`.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    *protocol_factory* must be a callable returning a
 | 
					
						
							|  |  |  |    :ref:`protocol <asyncio-protocol>` implementation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    A tuple of ``(transport, protocol)`` is returned on success.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Other arguments:
 | 
					
						
							| 
									
										
										
										
											2015-10-05 09:15:28 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * *local_addr*, if given, is a ``(local_host, local_port)`` tuple used
 | 
					
						
							| 
									
										
										
										
											2021-05-19 18:18:42 -03:00
										 |  |  |      to bind the socket locally.  The *local_host* and *local_port*
 | 
					
						
							| 
									
										
										
										
											2015-10-05 09:15:28 -07:00
										 |  |  |      are looked up using :meth:`getaddrinfo`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *remote_addr*, if given, is a ``(remote_host, remote_port)`` tuple used
 | 
					
						
							|  |  |  |      to connect the socket to a remote address.  The *remote_host* and
 | 
					
						
							|  |  |  |      *remote_port* are looked up using :meth:`getaddrinfo`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *family*, *proto*, *flags* are the optional address family, protocol
 | 
					
						
							|  |  |  |      and flags to be passed through to :meth:`getaddrinfo` for *host*
 | 
					
						
							|  |  |  |      resolution. If given, these should all be integers from the
 | 
					
						
							|  |  |  |      corresponding :mod:`socket` module constants.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *reuse_port* tells the kernel to allow this endpoint to be bound to the
 | 
					
						
							|  |  |  |      same port as other existing endpoints are bound to, so long as they all
 | 
					
						
							|  |  |  |      set this flag when being created. This option is not supported on Windows
 | 
					
						
							| 
									
										
										
										
											2023-10-29 22:31:01 +03:00
										 |  |  |      and some Unixes. If the :ref:`socket.SO_REUSEPORT <socket-unix-constants>` constant is not
 | 
					
						
							| 
									
										
										
										
											2015-10-05 09:15:28 -07:00
										 |  |  |      defined then this capability is unsupported.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *allow_broadcast* tells the kernel to allow this endpoint to send
 | 
					
						
							|  |  |  |      messages to the broadcast address.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *sock* can optionally be specified in order to use a preexisting,
 | 
					
						
							|  |  |  |      already connected, :class:`socket.socket` object to be used by the
 | 
					
						
							|  |  |  |      transport. If specified, *local_addr* and *remote_addr* should be omitted
 | 
					
						
							|  |  |  |      (must be :const:`None`).
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 16:42:01 -07:00
										 |  |  |      .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The *sock* argument transfers ownership of the socket to the
 | 
					
						
							|  |  |  |         transport created. To close the socket, call the transport's
 | 
					
						
							|  |  |  |         :meth:`~asyncio.BaseTransport.close` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 11:24:26 +02:00
										 |  |  |    See :ref:`UDP echo client protocol <asyncio-udp-echo-client-protocol>` and
 | 
					
						
							|  |  |  |    :ref:`UDP echo server protocol <asyncio-udp-echo-server-protocol>` examples.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 18:22:00 +02:00
										 |  |  |    .. versionchanged:: 3.4.4
 | 
					
						
							| 
									
										
										
										
											2021-09-08 19:58:43 +03:00
										 |  |  |       The *family*, *proto*, *flags*, *reuse_address*, *reuse_port*,
 | 
					
						
							| 
									
										
										
										
											2018-05-14 18:22:00 +02:00
										 |  |  |       *allow_broadcast*, and *sock* parameters were added.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 10:05:03 +02:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  |       Added support for Windows.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-09 09:21:10 -05:00
										 |  |  |    .. versionchanged:: 3.8.1
 | 
					
						
							| 
									
										
										
										
											2021-09-08 19:58:43 +03:00
										 |  |  |       The *reuse_address* parameter is no longer supported, as using
 | 
					
						
							| 
									
										
										
										
											2023-10-29 22:31:01 +03:00
										 |  |  |       :ref:`socket.SO_REUSEADDR <socket-unix-constants>`
 | 
					
						
							|  |  |  |       poses a significant security concern for
 | 
					
						
							| 
									
										
										
										
											2021-09-08 19:58:43 +03:00
										 |  |  |       UDP. Explicitly passing ``reuse_address=True`` will raise an exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       When multiple processes with differing UIDs assign sockets to an
 | 
					
						
							|  |  |  |       identical UDP socket address with ``SO_REUSEADDR``, incoming packets can
 | 
					
						
							|  |  |  |       become randomly distributed among the sockets.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       For supported platforms, *reuse_port* can be used as a replacement for
 | 
					
						
							|  |  |  |       similar functionality. With *reuse_port*,
 | 
					
						
							| 
									
										
										
										
											2023-10-29 22:31:01 +03:00
										 |  |  |       :ref:`socket.SO_REUSEPORT <socket-unix-constants>`
 | 
					
						
							|  |  |  |       is used instead, which specifically
 | 
					
						
							| 
									
										
										
										
											2021-09-08 19:58:43 +03:00
										 |  |  |       prevents processes with differing UIDs from assigning sockets to the same
 | 
					
						
							|  |  |  |       socket address.
 | 
					
						
							| 
									
										
										
										
											2019-12-09 09:21:10 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-08 19:58:43 +03:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							| 
									
										
										
										
											2024-03-05 17:41:53 +02:00
										 |  |  |       The *reuse_address* parameter, disabled since Python 3.8.1,
 | 
					
						
							| 
									
										
										
										
											2021-09-08 19:58:43 +03:00
										 |  |  |       3.7.6 and 3.6.10, has been entirely removed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.create_unix_connection(protocol_factory, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                         path=None, *, ssl=None, sock=None, \
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |                         server_hostname=None, ssl_handshake_timeout=None, \
 | 
					
						
							|  |  |  |                         ssl_shutdown_timeout=None)
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Create a Unix connection.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |    The socket family will be :py:const:`~socket.AF_UNIX`; socket
 | 
					
						
							|  |  |  |    type will be :py:const:`~socket.SOCK_STREAM`.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    A tuple of ``(transport, protocol)`` is returned on success.
 | 
					
						
							| 
									
										
										
										
											2016-11-03 14:17:25 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *path* is the name of a Unix domain socket and is required,
 | 
					
						
							|  |  |  |    unless a *sock* parameter is specified.  Abstract Unix sockets,
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :class:`str`, :class:`bytes`, and :class:`~pathlib.Path` paths are
 | 
					
						
							|  |  |  |    supported.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    See the documentation of the :meth:`loop.create_connection` method
 | 
					
						
							|  |  |  |    for information about arguments to this method.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Unix.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-20 17:26:28 -05:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       Added the *ssl_handshake_timeout* parameter.
 | 
					
						
							| 
									
										
										
										
											2018-06-08 11:36:00 -04:00
										 |  |  |       The *path* parameter can now be a :term:`path-like object`.
 | 
					
						
							| 
									
										
										
										
											2017-11-20 17:26:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Creating network servers
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-24 22:22:08 +07:00
										 |  |  | .. _loop_create_server:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.create_server(protocol_factory, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                         host=None, port=None, *, \
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                         family=socket.AF_UNSPEC, \
 | 
					
						
							|  |  |  |                         flags=socket.AI_PASSIVE, \
 | 
					
						
							|  |  |  |                         sock=None, backlog=100, ssl=None, \
 | 
					
						
							|  |  |  |                         reuse_address=None, reuse_port=None, \
 | 
					
						
							| 
									
										
										
										
											2023-12-13 11:23:29 +08:00
										 |  |  |                         keep_alive=None, \
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |                         ssl_handshake_timeout=None, \
 | 
					
						
							|  |  |  |                         ssl_shutdown_timeout=None, \
 | 
					
						
							|  |  |  |                         start_serving=True)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |    Create a TCP server (socket type :const:`~socket.SOCK_STREAM`) listening
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    on *port* of the *host* address.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Returns a :class:`Server` object.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Arguments:
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-16 19:40:44 -04:00
										 |  |  |    * *protocol_factory* must be a callable returning a
 | 
					
						
							|  |  |  |      :ref:`protocol <asyncio-protocol>` implementation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    * The *host* parameter can be set to several types which determine where
 | 
					
						
							|  |  |  |      the server would be listening:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      - If *host* is a string, the TCP server is bound to a single network
 | 
					
						
							|  |  |  |        interface specified by *host*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      - If *host* is a sequence of strings, the TCP server is bound to all
 | 
					
						
							|  |  |  |        network interfaces specified by the sequence.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      - If *host* is an empty string or ``None``, all interfaces are
 | 
					
						
							|  |  |  |        assumed and a list of multiple sockets will be returned (most likely
 | 
					
						
							|  |  |  |        one for IPv4 and another one for IPv6).
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-24 13:43:57 -06:00
										 |  |  |    * The *port* parameter can be set to specify which port the server should
 | 
					
						
							|  |  |  |      listen on. If ``0`` or ``None`` (the default), a random unused port will
 | 
					
						
							|  |  |  |      be selected (note that if *host* resolves to multiple network interfaces,
 | 
					
						
							|  |  |  |      a different random port will be selected for each interface).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |    * *family* can be set to either :const:`socket.AF_INET` or
 | 
					
						
							|  |  |  |      :const:`~socket.AF_INET6` to force the socket to use IPv4 or IPv6.
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |      If not set, the *family* will be determined from host name
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |      (defaults to :const:`~socket.AF_UNSPEC`).
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:36:04 +02:00
										 |  |  |    * *flags* is a bitmask for :meth:`getaddrinfo`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:36:04 +02:00
										 |  |  |    * *sock* can optionally be specified in order to use a preexisting
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |      socket object. If specified, *host* and *port* must not be specified.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 16:42:01 -07:00
										 |  |  |      .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The *sock* argument transfers ownership of the socket to the
 | 
					
						
							|  |  |  |         server created. To close the socket, call the server's
 | 
					
						
							|  |  |  |         :meth:`~asyncio.Server.close` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:36:04 +02:00
										 |  |  |    * *backlog* is the maximum number of queued connections passed to
 | 
					
						
							|  |  |  |      :meth:`~socket.socket.listen` (defaults to 100).
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-23 15:55:12 +05:30
										 |  |  |    * *ssl* can be set to an :class:`~ssl.SSLContext` instance to enable
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |      TLS over the accepted connections.
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:36:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * *reuse_address* tells the kernel to reuse a local socket in
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |      ``TIME_WAIT`` state, without waiting for its natural timeout to
 | 
					
						
							| 
									
										
										
										
											2016-10-19 18:30:05 +03:00
										 |  |  |      expire. If not specified will automatically be set to ``True`` on
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |      Unix.
 | 
					
						
							| 
									
										
										
										
											2014-10-12 20:36:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-05 09:15:28 -07:00
										 |  |  |    * *reuse_port* tells the kernel to allow this endpoint to be bound to the
 | 
					
						
							|  |  |  |      same port as other existing endpoints are bound to, so long as they all
 | 
					
						
							|  |  |  |      set this flag when being created. This option is not supported on
 | 
					
						
							|  |  |  |      Windows.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-13 11:23:29 +08:00
										 |  |  |    * *keep_alive* set to ``True`` keeps connections active by enabling the
 | 
					
						
							|  |  |  |      periodic transmission of messages.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.13
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *keep_alive* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    * *ssl_handshake_timeout* is (for a TLS server) the time in seconds to wait
 | 
					
						
							|  |  |  |      for the TLS handshake to complete before aborting the connection.
 | 
					
						
							| 
									
										
										
										
											2018-06-04 11:32:35 -04:00
										 |  |  |      ``60.0`` seconds if ``None`` (default).
 | 
					
						
							| 
									
										
										
										
											2017-12-19 19:45:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
 | 
					
						
							|  |  |  |      to complete before aborting the connection. ``30.0`` seconds if ``None``
 | 
					
						
							|  |  |  |      (default).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  |    * *start_serving* set to ``True`` (the default) causes the created server
 | 
					
						
							|  |  |  |      to start accepting connections immediately.  When set to ``False``,
 | 
					
						
							|  |  |  |      the user should await on :meth:`Server.start_serving` or
 | 
					
						
							|  |  |  |      :meth:`Server.serve_forever` to make the server to start accepting
 | 
					
						
							|  |  |  |      connections.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    .. versionchanged:: 3.5
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:02:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       Added support for SSL/TLS in :class:`ProactorEventLoop`.
 | 
					
						
							| 
									
										
										
										
											2014-01-23 11:02:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-21 18:41:05 +02:00
										 |  |  |    .. versionchanged:: 3.5.1
 | 
					
						
							| 
									
										
										
										
											2015-09-21 18:33:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       The *host* parameter can be a sequence of strings.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.6
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added *ssl_handshake_timeout* and *start_serving* parameters.
 | 
					
						
							| 
									
										
										
										
											2023-10-29 22:31:01 +03:00
										 |  |  |       The socket option :ref:`socket.TCP_NODELAY <socket-unix-constants>` is set by default
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       for all TCP connections.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The :func:`start_server` function is a higher-level alternative API
 | 
					
						
							|  |  |  |       that returns a pair of :class:`StreamReader` and :class:`StreamWriter`
 | 
					
						
							|  |  |  |       that can be used in an async/await code.
 | 
					
						
							| 
									
										
										
										
											2015-09-21 18:33:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.create_unix_server(protocol_factory, path=None, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                           *, sock=None, backlog=100, ssl=None, \
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |                           ssl_handshake_timeout=None, \
 | 
					
						
							|  |  |  |                           ssl_shutdown_timeout=None, \
 | 
					
						
							| 
									
										
										
										
											2023-11-08 17:10:10 +01:00
										 |  |  |                           start_serving=True, cleanup_socket=True)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Similar to :meth:`loop.create_server` but works with the
 | 
					
						
							| 
									
										
										
										
											2023-07-21 12:40:37 +03:00
										 |  |  |    :py:const:`~socket.AF_UNIX` socket family.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 13:32:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *path* is the name of a Unix domain socket, and is required,
 | 
					
						
							|  |  |  |    unless a *sock* argument is provided.  Abstract Unix sockets,
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :class:`str`, :class:`bytes`, and :class:`~pathlib.Path` paths
 | 
					
						
							|  |  |  |    are supported.
 | 
					
						
							| 
									
										
										
										
											2017-11-20 17:26:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-08 22:35:16 +03:00
										 |  |  |    If *cleanup_socket* is true then the Unix socket will automatically
 | 
					
						
							| 
									
										
										
										
											2023-11-08 17:10:10 +01:00
										 |  |  |    be removed from the filesystem when the server is closed, unless the
 | 
					
						
							|  |  |  |    socket has been replaced after the server has been created.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-16 19:40:44 -04:00
										 |  |  |    See the documentation of the :meth:`loop.create_server` method
 | 
					
						
							|  |  |  |    for information about arguments to this method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Unix.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-20 17:26:28 -05:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       Added the *ssl_handshake_timeout* and *start_serving* parameters.
 | 
					
						
							| 
									
										
										
										
											2017-11-20 17:26:28 -05:00
										 |  |  |       The *path* parameter can now be a :class:`~pathlib.Path` object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-08 17:10:10 +01:00
										 |  |  |    .. versionchanged:: 3.13
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *cleanup_socket* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.connect_accepted_socket(protocol_factory, \
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |                         sock, *, ssl=None, ssl_handshake_timeout=None, \
 | 
					
						
							|  |  |  |                         ssl_shutdown_timeout=None)
 | 
					
						
							| 
									
										
										
										
											2016-11-07 15:35:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Wrap an already accepted connection into a transport/protocol pair.
 | 
					
						
							| 
									
										
										
										
											2016-11-07 15:35:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    This method can be used by servers that accept connections outside
 | 
					
						
							|  |  |  |    of asyncio but that use asyncio to handle them.
 | 
					
						
							| 
									
										
										
										
											2016-11-07 15:35:25 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Parameters:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-16 19:40:44 -04:00
										 |  |  |    * *protocol_factory* must be a callable returning a
 | 
					
						
							|  |  |  |      :ref:`protocol <asyncio-protocol>` implementation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    * *sock* is a preexisting socket object returned from
 | 
					
						
							|  |  |  |      :meth:`socket.accept <socket.socket.accept>`.
 | 
					
						
							| 
									
										
										
										
											2016-11-07 15:35:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 16:42:01 -07:00
										 |  |  |      .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         The *sock* argument transfers ownership of the socket to the
 | 
					
						
							|  |  |  |         transport created. To close the socket, call the transport's
 | 
					
						
							|  |  |  |         :meth:`~asyncio.BaseTransport.close` method.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-23 15:55:12 +05:30
										 |  |  |    * *ssl* can be set to an :class:`~ssl.SSLContext` to enable SSL over
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |      the accepted connections.
 | 
					
						
							| 
									
										
										
										
											2016-11-07 15:35:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-19 19:45:42 +00:00
										 |  |  |    * *ssl_handshake_timeout* is (for an SSL connection) the time in seconds to
 | 
					
						
							|  |  |  |      wait for the SSL handshake to complete before aborting the connection.
 | 
					
						
							| 
									
										
										
										
											2018-06-04 11:32:35 -04:00
										 |  |  |      ``60.0`` seconds if ``None`` (default).
 | 
					
						
							| 
									
										
										
										
											2017-12-19 19:45:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
 | 
					
						
							|  |  |  |      to complete before aborting the connection. ``30.0`` seconds if ``None``
 | 
					
						
							|  |  |  |      (default).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Returns a ``(transport, protocol)`` pair.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionadded:: 3.5.3
 | 
					
						
							| 
									
										
										
										
											2017-12-19 19:45:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							| 
									
										
										
										
											2017-12-19 19:45:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       Added the *ssl_handshake_timeout* parameter.
 | 
					
						
							| 
									
										
										
										
											2017-11-21 11:06:26 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-21 11:06:26 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Transferring files
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2018-01-27 21:22:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.sendfile(transport, file, \
 | 
					
						
							|  |  |  |                                    offset=0, count=None, *, fallback=True)
 | 
					
						
							| 
									
										
										
										
											2018-01-27 21:22:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Send a *file* over a *transport*.  Return the total number of bytes
 | 
					
						
							|  |  |  |    sent.
 | 
					
						
							| 
									
										
										
										
											2018-01-27 21:22:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The method uses high-performance :meth:`os.sendfile` if available.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *file* must be a regular file object opened in binary mode.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *offset* tells from where to start reading the file. If specified,
 | 
					
						
							|  |  |  |    *count* is the total number of bytes to transmit as opposed to
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    sending the file until EOF is reached. File position is always updated,
 | 
					
						
							|  |  |  |    even when this method raises an error, and
 | 
					
						
							|  |  |  |    :meth:`file.tell() <io.IOBase.tell>` can be used to obtain the actual
 | 
					
						
							|  |  |  |    number of bytes sent.
 | 
					
						
							| 
									
										
										
										
											2018-01-27 21:22:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    *fallback* set to ``True`` makes asyncio to manually read and send
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    the file when the platform does not support the sendfile system call
 | 
					
						
							| 
									
										
										
										
											2018-01-27 21:22:47 +02:00
										 |  |  |    (e.g. Windows or SSL socket on Unix).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Raise :exc:`SendfileNotAvailableError` if the system does not support
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    the *sendfile* syscall and *fallback* is ``False``.
 | 
					
						
							| 
									
										
										
										
											2018-01-27 21:22:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | TLS Upgrade
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | ^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.start_tls(transport, protocol, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                         sslcontext, *, server_side=False, \
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |                         server_hostname=None, ssl_handshake_timeout=None, \
 | 
					
						
							|  |  |  |                         ssl_shutdown_timeout=None)
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Upgrade an existing transport-based connection to TLS.
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-02 08:52:19 +04:00
										 |  |  |    Create a TLS coder/decoder instance and insert it between the *transport*
 | 
					
						
							|  |  |  |    and the *protocol*. The coder/decoder implements both *transport*-facing
 | 
					
						
							|  |  |  |    protocol and *protocol*-facing transport.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return the created two-interface instance. After *await*, the *protocol*
 | 
					
						
							|  |  |  |    must stop using the original *transport* and communicate with the returned
 | 
					
						
							|  |  |  |    object only because the coder caches *protocol*-side data and sporadically
 | 
					
						
							|  |  |  |    exchanges extra TLS session packets with *transport*.
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 11:38:15 +01:00
										 |  |  |    In some situations (e.g. when the passed transport is already closing) this
 | 
					
						
							|  |  |  |    may return ``None``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  |    Parameters:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *transport* and *protocol* instances that methods like
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |      :meth:`~loop.create_server` and
 | 
					
						
							|  |  |  |      :meth:`~loop.create_connection` return.
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * *sslcontext*: a configured instance of :class:`~ssl.SSLContext`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *server_side* pass ``True`` when a server-side connection is being
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |      upgraded (like the one created by :meth:`~loop.create_server`).
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * *server_hostname*: sets or overrides the host name that the target
 | 
					
						
							|  |  |  |      server's certificate will be matched against.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    * *ssl_handshake_timeout* is (for a TLS connection) the time in seconds to
 | 
					
						
							|  |  |  |      wait for the TLS handshake to complete before aborting the connection.
 | 
					
						
							| 
									
										
										
										
											2018-06-04 11:32:35 -04:00
										 |  |  |      ``60.0`` seconds if ``None`` (default).
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    * *ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown
 | 
					
						
							|  |  |  |      to complete before aborting the connection. ``30.0`` seconds if ``None``
 | 
					
						
							|  |  |  |      (default).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  |    .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-26 18:36:43 +05:30
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Added the *ssl_shutdown_timeout* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 00:35:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Watching file descriptors
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. method:: loop.add_reader(fd, callback, *args)
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Start monitoring the *fd* file descriptor for read availability and
 | 
					
						
							|  |  |  |    invoke *callback* with the specified arguments once *fd* is available for
 | 
					
						
							|  |  |  |    reading.
 | 
					
						
							| 
									
										
										
										
											2014-11-28 13:15:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 15:40:45 +05:30
										 |  |  |    Any preexisting callback registered for *fd* is cancelled and replaced by
 | 
					
						
							|  |  |  |    *callback*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.remove_reader(fd)
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-16 14:04:55 -05:00
										 |  |  |    Stop monitoring the *fd* file descriptor for read availability. Returns
 | 
					
						
							|  |  |  |    ``True`` if *fd* was previously being monitored for reads.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. method:: loop.add_writer(fd, callback, *args)
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Start monitoring the *fd* file descriptor for write availability and
 | 
					
						
							|  |  |  |    invoke *callback* with the specified arguments once *fd* is available for
 | 
					
						
							|  |  |  |    writing.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-09 15:40:45 +05:30
										 |  |  |    Any preexisting callback registered for *fd* is cancelled and replaced by
 | 
					
						
							|  |  |  |    *callback*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    Use :func:`functools.partial` :ref:`to pass keyword arguments
 | 
					
						
							| 
									
										
										
										
											2018-12-04 09:31:15 +02:00
										 |  |  |    <asyncio-pass-keywords>` to *callback*.
 | 
					
						
							| 
									
										
										
										
											2014-11-28 13:15:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.remove_writer(fd)
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-16 14:04:55 -05:00
										 |  |  |    Stop monitoring the *fd* file descriptor for write availability. Returns
 | 
					
						
							|  |  |  |    ``True`` if *fd* was previously being monitored for writes.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | See also :ref:`Platform Support <asyncio-platform-support>` section
 | 
					
						
							|  |  |  | for some limitations of these methods.
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Working with socket objects directly
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  | In general, protocol implementations that use transport-based APIs
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | such as :meth:`loop.create_connection` and :meth:`loop.create_server`
 | 
					
						
							|  |  |  | are faster than implementations that work with sockets directly.
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  | However, there are some use cases when performance is not critical, and
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | working with :class:`~socket.socket` objects directly is more
 | 
					
						
							|  |  |  | convenient.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.sock_recv(sock, nbytes)
 | 
					
						
							| 
									
										
										
										
											2016-06-08 12:48:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Receive up to *nbytes* from *sock*.  Asynchronous version of
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :meth:`socket.recv() <socket.socket.recv>`.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Return the received data as a bytes object.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							| 
									
										
										
										
											2014-07-29 23:12:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 20:53:26 -05:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |       Even though this method was always documented as a coroutine
 | 
					
						
							|  |  |  |       method, releases before Python 3.7 returned a :class:`Future`.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       Since Python 3.7 this is an ``async def`` method.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.sock_recv_into(sock, buf)
 | 
					
						
							| 
									
										
										
										
											2017-10-19 21:46:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Receive data from *sock* into the *buf* buffer.  Modeled after the blocking
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :meth:`socket.recv_into() <socket.socket.recv_into>` method.
 | 
					
						
							| 
									
										
										
										
											2017-10-19 21:46:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Return the number of bytes written to the buffer.
 | 
					
						
							| 
									
										
										
										
											2017-10-19 21:46:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							| 
									
										
										
										
											2017-10-19 21:46:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-13 18:42:29 +02:00
										 |  |  | .. coroutinemethod:: loop.sock_recvfrom(sock, bufsize)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Receive a datagram of up to *bufsize* from *sock*.  Asynchronous version of
 | 
					
						
							|  |  |  |    :meth:`socket.recvfrom() <socket.socket.recvfrom>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return a tuple of (received data, remote address).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. coroutinemethod:: loop.sock_recvfrom_into(sock, buf, nbytes=0)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Receive a datagram of up to *nbytes* from *sock* into *buf*.
 | 
					
						
							|  |  |  |    Asynchronous version of
 | 
					
						
							|  |  |  |    :meth:`socket.recvfrom_into() <socket.socket.recvfrom_into>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return a tuple of (number of bytes received, remote address).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.sock_sendall(sock, data)
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Send *data* to the *sock* socket. Asynchronous version of
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :meth:`socket.sendall() <socket.socket.sendall>`.
 | 
					
						
							| 
									
										
										
										
											2016-06-08 12:48:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    This method continues to send to the socket until either all data
 | 
					
						
							|  |  |  |    in *data* has been sent or an error occurs.  ``None`` is returned
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    on success.  On error, an exception is raised. Additionally, there is no way
 | 
					
						
							|  |  |  |    to determine how much data, if any, was successfully processed by the
 | 
					
						
							|  |  |  |    receiving end of the connection.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							| 
									
										
										
										
											2014-07-29 23:12:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 20:53:26 -05:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Even though the method was always documented as a coroutine
 | 
					
						
							| 
									
										
										
										
											2021-12-23 14:47:31 +05:30
										 |  |  |       method, before Python 3.7 it returned a :class:`Future`.
 | 
					
						
							| 
									
										
										
										
											2017-12-14 20:53:26 -05:00
										 |  |  |       Since Python 3.7, this is an ``async def`` method.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-13 18:42:29 +02:00
										 |  |  | .. coroutinemethod:: loop.sock_sendto(sock, data, address)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Send a datagram from *sock* to *address*.
 | 
					
						
							|  |  |  |    Asynchronous version of
 | 
					
						
							|  |  |  |    :meth:`socket.sendto() <socket.socket.sendto>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return the number of bytes sent.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.sock_connect(sock, address)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Connect *sock* to a remote socket at *address*.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Asynchronous version of :meth:`socket.connect() <socket.socket.connect>`.
 | 
					
						
							| 
									
										
										
										
											2014-02-13 09:24:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							| 
									
										
										
										
											2014-07-29 23:12:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 12:48:15 -04:00
										 |  |  |    .. versionchanged:: 3.5.2
 | 
					
						
							|  |  |  |       ``address`` no longer needs to be resolved.  ``sock_connect``
 | 
					
						
							|  |  |  |       will try to check if the *address* is already resolved by calling
 | 
					
						
							|  |  |  |       :func:`socket.inet_pton`.  If not,
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       :meth:`loop.getaddrinfo` will be used to resolve the
 | 
					
						
							| 
									
										
										
										
											2016-06-08 12:48:15 -04:00
										 |  |  |       *address*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  |    .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       :meth:`loop.create_connection`
 | 
					
						
							| 
									
										
										
										
											2016-06-08 12:48:15 -04:00
										 |  |  |       and  :func:`asyncio.open_connection() <open_connection>`.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.sock_accept(sock)
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Accept a connection.  Modeled after the blocking
 | 
					
						
							|  |  |  |    :meth:`socket.accept() <socket.socket.accept>` method.
 | 
					
						
							| 
									
										
										
										
											2016-06-08 12:48:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The socket must be bound to an address and listening
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  |    for connections. The return value is a pair ``(conn, address)`` where *conn*
 | 
					
						
							|  |  |  |    is a *new* socket object usable to send and receive data on the connection,
 | 
					
						
							|  |  |  |    and *address* is the address bound to the socket on the other end of the
 | 
					
						
							|  |  |  |    connection.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							| 
									
										
										
										
											2014-07-29 23:12:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 20:53:26 -05:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Even though the method was always documented as a coroutine
 | 
					
						
							|  |  |  |       method, before Python 3.7 it returned a :class:`Future`.
 | 
					
						
							|  |  |  |       Since Python 3.7, this is an ``async def`` method.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       :meth:`loop.create_server` and :func:`start_server`.
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.sock_sendfile(sock, file, offset=0, count=None, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                                         *, fallback=True)
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Send a file using high-performance :mod:`os.sendfile` if possible.
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Return the total number of bytes sent.
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Asynchronous version of :meth:`socket.sendfile() <socket.socket.sendfile>`.
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *sock* must be a non-blocking :const:`socket.SOCK_STREAM`
 | 
					
						
							|  |  |  |    :class:`~socket.socket`.
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *file* must be a regular file object open in binary mode.
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    *offset* tells from where to start reading the file. If specified,
 | 
					
						
							|  |  |  |    *count* is the total number of bytes to transmit as opposed to
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    sending the file until EOF is reached. File position is always updated,
 | 
					
						
							|  |  |  |    even when this method raises an error, and
 | 
					
						
							|  |  |  |    :meth:`file.tell() <io.IOBase.tell>` can be used to obtain the actual
 | 
					
						
							|  |  |  |    number of bytes sent.
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    *fallback*, when set to ``True``, makes asyncio manually read and send
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  |    the file when the platform does not support the sendfile syscall
 | 
					
						
							|  |  |  |    (e.g. Windows or SSL socket on Unix).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 20:04:29 +02:00
										 |  |  |    Raise :exc:`SendfileNotAvailableError` if the system does not support
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  |    *sendfile* syscall and *fallback* is ``False``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *sock* must be a non-blocking socket.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-16 19:59:34 +02:00
										 |  |  |    .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-08 23:22:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | DNS
 | 
					
						
							|  |  |  | ^^^
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. coroutinemethod:: loop.getaddrinfo(host, port, *, family=0, \
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                         type=0, proto=0, flags=0)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Asynchronous version of :meth:`socket.getaddrinfo`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.getnameinfo(sockaddr, flags=0)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Asynchronous version of :meth:`socket.getnameinfo`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-24 10:35:02 +02:00
										 |  |  | .. note::
 | 
					
						
							|  |  |  |    Both *getaddrinfo* and *getnameinfo* internally utilize their synchronous
 | 
					
						
							|  |  |  |    versions through the loop's default thread pool executor.
 | 
					
						
							|  |  |  |    When this executor is saturated, these methods may experience delays,
 | 
					
						
							|  |  |  |    which higher-level networking libraries may report as increased timeouts.
 | 
					
						
							|  |  |  |    To mitigate this, consider using a custom executor for other user tasks,
 | 
					
						
							|  |  |  |    or setting a default executor with a larger number of workers.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 14:09:40 -05:00
										 |  |  | .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |    Both *getaddrinfo* and *getnameinfo* methods were always documented
 | 
					
						
							|  |  |  |    to return a coroutine, but prior to Python 3.7 they were, in fact,
 | 
					
						
							|  |  |  |    returning :class:`asyncio.Future` objects.  Starting with Python 3.7
 | 
					
						
							|  |  |  |    both methods are coroutines.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Working with pipes
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.connect_read_pipe(protocol_factory, pipe)
 | 
					
						
							| 
									
										
										
										
											2014-08-31 14:47:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Register the read end of *pipe* in the event loop.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    *protocol_factory* must be a callable returning an
 | 
					
						
							|  |  |  |    :ref:`asyncio protocol <asyncio-protocol>` implementation.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    *pipe* is a :term:`file-like object <file object>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return pair ``(transport, protocol)``, where *transport* supports
 | 
					
						
							| 
									
										
										
										
											2018-09-16 19:40:44 -04:00
										 |  |  |    the :class:`ReadTransport` interface and *protocol* is an object
 | 
					
						
							|  |  |  |    instantiated by the *protocol_factory*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-26 01:01:59 +02:00
										 |  |  |    With :class:`SelectorEventLoop` event loop, the *pipe* is set to
 | 
					
						
							|  |  |  |    non-blocking mode.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. coroutinemethod:: loop.connect_write_pipe(protocol_factory, pipe)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Register the write end of *pipe* in the event loop.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    *protocol_factory* must be a callable returning an
 | 
					
						
							|  |  |  |    :ref:`asyncio protocol <asyncio-protocol>` implementation.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    *pipe* is :term:`file-like object <file object>`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 22:38:46 +02:00
										 |  |  |    Return pair ``(transport, protocol)``, where *transport* supports
 | 
					
						
							| 
									
										
										
										
											2018-09-16 19:40:44 -04:00
										 |  |  |    :class:`WriteTransport` interface and *protocol* is an object
 | 
					
						
							|  |  |  |    instantiated by the *protocol_factory*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-26 01:01:59 +02:00
										 |  |  |    With :class:`SelectorEventLoop` event loop, the *pipe* is set to
 | 
					
						
							|  |  |  |    non-blocking mode.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    :class:`SelectorEventLoop` does not support the above methods on
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    Windows.  Use :class:`ProactorEventLoop` instead for Windows.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-02 22:43:39 +01:00
										 |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    The :meth:`loop.subprocess_exec` and
 | 
					
						
							|  |  |  |    :meth:`loop.subprocess_shell` methods.
 | 
					
						
							| 
									
										
										
										
											2014-02-02 22:43:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | Unix signals
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | ^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-24 22:22:08 +07:00
										 |  |  | .. _loop_add_signal_handler:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. method:: loop.add_signal_handler(signum, callback, *args)
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Set *callback* as the handler for the *signum* signal.
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 22:31:29 +01:00
										 |  |  |    The callback will be invoked by *loop*, along with other queued callbacks
 | 
					
						
							|  |  |  |    and runnable coroutines of that event loop. Unlike signal handlers
 | 
					
						
							|  |  |  |    registered using :func:`signal.signal`, a callback registered with this
 | 
					
						
							|  |  |  |    function is allowed to interact with the event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  |    Raise :exc:`ValueError` if the signal number is invalid or uncatchable.
 | 
					
						
							|  |  |  |    Raise :exc:`RuntimeError` if there is a problem setting up the handler.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    Use :func:`functools.partial` :ref:`to pass keyword arguments
 | 
					
						
							| 
									
										
										
										
											2018-12-04 09:31:15 +02:00
										 |  |  |    <asyncio-pass-keywords>` to *callback*.
 | 
					
						
							| 
									
										
										
										
											2014-11-28 13:15:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 22:31:29 +01:00
										 |  |  |    Like :func:`signal.signal`, this function must be invoked in the main
 | 
					
						
							|  |  |  |    thread.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.remove_signal_handler(sig)
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Remove the handler for the *sig* signal.
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Return ``True`` if the signal handler was removed, or ``False`` if
 | 
					
						
							|  |  |  |    no handler was set for the given signal.
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Unix.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The :mod:`signal` module.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Executing code in thread or process pools
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. awaitablemethod:: loop.run_in_executor(executor, func, *args)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Arrange for *func* to be called in the specified executor.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    The *executor* argument should be an :class:`concurrent.futures.Executor`
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  |    instance. The default executor is used if *executor* is ``None``.
 | 
					
						
							| 
									
										
										
										
											2024-07-09 17:22:07 +08:00
										 |  |  |    The default executor can be set by :meth:`loop.set_default_executor`,
 | 
					
						
							|  |  |  |    otherwise, a :class:`concurrent.futures.ThreadPoolExecutor` will be
 | 
					
						
							|  |  |  |    lazy-initialized and used by :func:`run_in_executor` if needed.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       import asyncio
 | 
					
						
							|  |  |  |       import concurrent.futures
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def blocking_io():
 | 
					
						
							|  |  |  |           # File operations (such as logging) can block the
 | 
					
						
							|  |  |  |           # event loop: run them in a thread pool.
 | 
					
						
							|  |  |  |           with open('/dev/urandom', 'rb') as f:
 | 
					
						
							|  |  |  |               return f.read(100)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def cpu_bound():
 | 
					
						
							|  |  |  |           # CPU-bound operations will block the event loop:
 | 
					
						
							|  |  |  |           # in general it is preferable to run them in a
 | 
					
						
							|  |  |  |           # process pool.
 | 
					
						
							|  |  |  |           return sum(i * i for i in range(10 ** 7))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async def main():
 | 
					
						
							|  |  |  |           loop = asyncio.get_running_loop()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           ## Options:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # 1. Run in the default loop's executor:
 | 
					
						
							|  |  |  |           result = await loop.run_in_executor(
 | 
					
						
							|  |  |  |               None, blocking_io)
 | 
					
						
							|  |  |  |           print('default thread pool', result)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # 2. Run in a custom thread pool:
 | 
					
						
							|  |  |  |           with concurrent.futures.ThreadPoolExecutor() as pool:
 | 
					
						
							|  |  |  |               result = await loop.run_in_executor(
 | 
					
						
							|  |  |  |                   pool, blocking_io)
 | 
					
						
							|  |  |  |               print('custom thread pool', result)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # 3. Run in a custom process pool:
 | 
					
						
							|  |  |  |           with concurrent.futures.ProcessPoolExecutor() as pool:
 | 
					
						
							|  |  |  |               result = await loop.run_in_executor(
 | 
					
						
							|  |  |  |                   pool, cpu_bound)
 | 
					
						
							|  |  |  |               print('custom process pool', result)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-16 16:50:46 -06:00
										 |  |  |           # 4. Run in a custom interpreter pool:
 | 
					
						
							|  |  |  |           with concurrent.futures.InterpreterPoolExecutor() as pool:
 | 
					
						
							|  |  |  |               result = await loop.run_in_executor(
 | 
					
						
							|  |  |  |                   pool, cpu_bound)
 | 
					
						
							|  |  |  |               print('custom interpreter pool', result)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-16 10:04:43 -07:00
										 |  |  |       if __name__ == '__main__':
 | 
					
						
							|  |  |  |           asyncio.run(main())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Note that the entry point guard (``if __name__ == '__main__'``)
 | 
					
						
							|  |  |  |    is required for option 3 due to the peculiarities of :mod:`multiprocessing`,
 | 
					
						
							|  |  |  |    which is used by :class:`~concurrent.futures.ProcessPoolExecutor`.
 | 
					
						
							|  |  |  |    See :ref:`Safe importing of main module <multiprocessing-safe-main-import>`.
 | 
					
						
							| 
									
										
										
										
											2014-11-28 13:15:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-28 14:09:40 -05:00
										 |  |  |    This method returns a :class:`asyncio.Future` object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    Use :func:`functools.partial` :ref:`to pass keyword arguments
 | 
					
						
							|  |  |  |    <asyncio-pass-keywords>` to *func*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-21 17:40:42 -04:00
										 |  |  |    .. versionchanged:: 3.5.3
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       :meth:`loop.run_in_executor` no longer configures the
 | 
					
						
							| 
									
										
										
										
											2016-10-21 17:40:42 -04:00
										 |  |  |       ``max_workers`` of the thread pool executor it creates, instead
 | 
					
						
							|  |  |  |       leaving it up to the thread pool executor
 | 
					
						
							|  |  |  |       (:class:`~concurrent.futures.ThreadPoolExecutor`) to set the
 | 
					
						
							|  |  |  |       default.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.set_default_executor(executor)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-30 11:42:43 +01:00
										 |  |  |    Set *executor* as the default executor used by :meth:`run_in_executor`.
 | 
					
						
							| 
									
										
										
										
											2021-07-01 17:46:49 +03:00
										 |  |  |    *executor* must be an instance of
 | 
					
						
							| 
									
										
										
										
											2024-10-16 16:50:46 -06:00
										 |  |  |    :class:`~concurrent.futures.ThreadPoolExecutor`, which includes
 | 
					
						
							|  |  |  |    :class:`~concurrent.futures.InterpreterPoolExecutor`.
 | 
					
						
							| 
									
										
										
										
											2018-07-30 11:42:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-01 17:46:49 +03:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       *executor* must be an instance of
 | 
					
						
							|  |  |  |       :class:`~concurrent.futures.ThreadPoolExecutor`.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | Error Handling API
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | ^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 05:44:01 +00:00
										 |  |  | Allows customizing how exceptions are handled in the event loop.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.set_exception_handler(handler)
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Set *handler* as the new event loop exception handler.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If *handler* is ``None``, the default exception handler will
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    be set.  Otherwise, *handler* must be a callable with the signature
 | 
					
						
							|  |  |  |    matching ``(loop, context)``, where ``loop``
 | 
					
						
							|  |  |  |    is a reference to the active event loop, and ``context``
 | 
					
						
							|  |  |  |    is a ``dict`` object containing the details of the exception
 | 
					
						
							|  |  |  |    (see :meth:`call_exception_handler` documentation for details
 | 
					
						
							|  |  |  |    about context).
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-04 23:49:10 -07:00
										 |  |  |    If the handler is called on behalf of a :class:`~asyncio.Task` or
 | 
					
						
							|  |  |  |    :class:`~asyncio.Handle`, it is run in the
 | 
					
						
							|  |  |  |    :class:`contextvars.Context` of that task or callback handle.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.12
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The handler may be called in the :class:`~contextvars.Context`
 | 
					
						
							|  |  |  |       of the task or handle where the exception originated.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.get_exception_handler()
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Return the current exception handler, or ``None`` if no custom
 | 
					
						
							|  |  |  |    exception handler was set.
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.5.2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.default_exception_handler(context)
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Default exception handler.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is called when an exception occurs and no exception
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    handler is set. This can be called by a custom exception
 | 
					
						
							|  |  |  |    handler that wants to defer to the default handler behavior.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    *context* parameter has the same meaning as in
 | 
					
						
							|  |  |  |    :meth:`call_exception_handler`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.call_exception_handler(context)
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Call the current event loop exception handler.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *context* is a ``dict`` object containing the following keys
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    (new keys may be introduced in future Python versions):
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * 'message': Error message;
 | 
					
						
							|  |  |  |    * 'exception' (optional): Exception object;
 | 
					
						
							|  |  |  |    * 'future' (optional): :class:`asyncio.Future` instance;
 | 
					
						
							| 
									
										
										
										
											2020-11-26 05:24:48 -08:00
										 |  |  |    * 'task' (optional): :class:`asyncio.Task` instance;
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  |    * 'handle' (optional): :class:`asyncio.Handle` instance;
 | 
					
						
							|  |  |  |    * 'protocol' (optional): :ref:`Protocol <asyncio-protocol>` instance;
 | 
					
						
							|  |  |  |    * 'transport' (optional): :ref:`Transport <asyncio-transport>` instance;
 | 
					
						
							| 
									
										
										
										
											2020-11-26 05:24:48 -08:00
										 |  |  |    * 'socket' (optional): :class:`socket.socket` instance;
 | 
					
						
							|  |  |  |    * 'asyncgen' (optional): Asynchronous generator that caused
 | 
					
						
							|  |  |  |                             the exception.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |        This method should not be overloaded in subclassed
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |        event loops.  For custom exception handling, use
 | 
					
						
							| 
									
										
										
										
											2024-09-01 12:59:42 +08:00
										 |  |  |        the :meth:`set_exception_handler` method.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Enabling debug mode
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.get_debug()
 | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 00:12:14 +02:00
										 |  |  |    Get the debug mode (:class:`bool`) of the event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The default value is ``True`` if the environment variable
 | 
					
						
							|  |  |  |    :envvar:`PYTHONASYNCIODEBUG` is set to a non-empty string, ``False``
 | 
					
						
							|  |  |  |    otherwise.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. method:: loop.set_debug(enabled: bool)
 | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Set the debug mode of the event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 16:57:11 -07:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-24 10:22:18 +01:00
										 |  |  |       The new :ref:`Python Development Mode <devmode>` can now also be used
 | 
					
						
							| 
									
										
										
										
											2018-09-14 16:57:11 -07:00
										 |  |  |       to enable the debug mode.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-22 20:11:57 +03:00
										 |  |  | .. attribute:: loop.slow_callback_duration
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This attribute can be used to set the
 | 
					
						
							|  |  |  |    minimum execution duration in seconds that is considered "slow".
 | 
					
						
							|  |  |  |    When debug mode is enabled, "slow" callbacks are logged.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Default value is 100 milliseconds.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 00:36:11 +02:00
										 |  |  |    The :ref:`debug mode of asyncio <asyncio-debug-mode>`.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 23:15:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Running Subprocesses
 | 
					
						
							|  |  |  | ^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | Methods described in this subsections are low-level.  In regular
 | 
					
						
							|  |  |  | async/await code consider using the high-level
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | :func:`asyncio.create_subprocess_shell` and
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | :func:`asyncio.create_subprocess_exec` convenience functions instead.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-01 07:24:46 -05:00
										 |  |  |    On Windows, the default event loop :class:`ProactorEventLoop` supports
 | 
					
						
							|  |  |  |    subprocesses, whereas :class:`SelectorEventLoop` does not. See
 | 
					
						
							|  |  |  |    :ref:`Subprocess Support on Windows <asyncio-windows-subprocess>` for
 | 
					
						
							|  |  |  |    details.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-24 22:22:08 +07:00
										 |  |  | .. _loop_subprocess_exec:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. coroutinemethod:: loop.subprocess_exec(protocol_factory, *args, \
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                       stdin=subprocess.PIPE, stdout=subprocess.PIPE, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                       stderr=subprocess.PIPE, **kwargs)
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Create a subprocess from one or more string arguments specified by
 | 
					
						
							|  |  |  |    *args*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    *args* must be a list of strings represented by:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * :class:`str`;
 | 
					
						
							|  |  |  |    * or :class:`bytes`, encoded to the
 | 
					
						
							|  |  |  |      :ref:`filesystem encoding <filesystem-encoding>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    The first string specifies the program executable,
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |    and the remaining strings specify the arguments.  Together, string
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    arguments form the ``argv`` of the program.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is similar to the standard library :class:`subprocess.Popen`
 | 
					
						
							|  |  |  |    class called with ``shell=False`` and the list of strings passed as
 | 
					
						
							|  |  |  |    the first argument; however, where :class:`~subprocess.Popen` takes
 | 
					
						
							|  |  |  |    a single argument which is list of strings, *subprocess_exec*
 | 
					
						
							|  |  |  |    takes multiple string arguments.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    The *protocol_factory* must be a callable returning a subclass of the
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :class:`asyncio.SubprocessProtocol` class.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Other parameters:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-27 19:51:19 -04:00
										 |  |  |    * *stdin* can be any of these:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 21:57:19 +03:00
										 |  |  |      * a file-like object
 | 
					
						
							| 
									
										
										
										
											2024-09-01 12:59:42 +08:00
										 |  |  |      * an existing file descriptor (a positive integer), for example those created with :meth:`os.pipe`
 | 
					
						
							| 
									
										
										
										
											2019-05-27 19:51:19 -04:00
										 |  |  |      * the :const:`subprocess.PIPE` constant (default) which will create a new
 | 
					
						
							|  |  |  |        pipe and connect it,
 | 
					
						
							|  |  |  |      * the value ``None`` which will make the subprocess inherit the file
 | 
					
						
							|  |  |  |        descriptor from this process
 | 
					
						
							|  |  |  |      * the :const:`subprocess.DEVNULL` constant which indicates that the
 | 
					
						
							|  |  |  |        special :data:`os.devnull` file will be used
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *stdout* can be any of these:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 21:57:19 +03:00
										 |  |  |      * a file-like object
 | 
					
						
							| 
									
										
										
										
											2019-05-27 19:51:19 -04:00
										 |  |  |      * the :const:`subprocess.PIPE` constant (default) which will create a new
 | 
					
						
							|  |  |  |        pipe and connect it,
 | 
					
						
							|  |  |  |      * the value ``None`` which will make the subprocess inherit the file
 | 
					
						
							|  |  |  |        descriptor from this process
 | 
					
						
							|  |  |  |      * the :const:`subprocess.DEVNULL` constant which indicates that the
 | 
					
						
							|  |  |  |        special :data:`os.devnull` file will be used
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * *stderr* can be any of these:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 21:57:19 +03:00
										 |  |  |      * a file-like object
 | 
					
						
							| 
									
										
										
										
											2019-05-27 19:51:19 -04:00
										 |  |  |      * the :const:`subprocess.PIPE` constant (default) which will create a new
 | 
					
						
							|  |  |  |        pipe and connect it,
 | 
					
						
							|  |  |  |      * the value ``None`` which will make the subprocess inherit the file
 | 
					
						
							|  |  |  |        descriptor from this process
 | 
					
						
							|  |  |  |      * the :const:`subprocess.DEVNULL` constant which indicates that the
 | 
					
						
							|  |  |  |        special :data:`os.devnull` file will be used
 | 
					
						
							|  |  |  |      * the :const:`subprocess.STDOUT` constant which will connect the standard
 | 
					
						
							|  |  |  |        error stream to the process' standard output stream
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * All other keyword arguments are passed to :class:`subprocess.Popen`
 | 
					
						
							| 
									
										
										
										
											2019-05-27 19:51:19 -04:00
										 |  |  |      without interpretation, except for *bufsize*, *universal_newlines*,
 | 
					
						
							|  |  |  |      *shell*, *text*, *encoding* and *errors*, which should not be specified
 | 
					
						
							|  |  |  |      at all.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      The ``asyncio`` subprocess API does not support decoding the streams
 | 
					
						
							|  |  |  |      as text. :func:`bytes.decode` can be used to convert the bytes returned
 | 
					
						
							|  |  |  |      from the stream to text.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 21:57:19 +03:00
										 |  |  |    If a file-like object passed as *stdin*, *stdout* or *stderr* represents a
 | 
					
						
							|  |  |  |    pipe, then the other side of this pipe should be registered with
 | 
					
						
							|  |  |  |    :meth:`~loop.connect_write_pipe` or :meth:`~loop.connect_read_pipe` for use
 | 
					
						
							|  |  |  |    with the event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    See the constructor of the :class:`subprocess.Popen` class
 | 
					
						
							|  |  |  |    for documentation on other arguments.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Returns a pair of ``(transport, protocol)``, where *transport*
 | 
					
						
							| 
									
										
										
										
											2018-09-16 19:40:44 -04:00
										 |  |  |    conforms to the :class:`asyncio.SubprocessTransport` base class and
 | 
					
						
							|  |  |  |    *protocol* is an object instantiated by the *protocol_factory*.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. coroutinemethod:: loop.subprocess_shell(protocol_factory, cmd, *, \
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |                         stdin=subprocess.PIPE, stdout=subprocess.PIPE, \
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |                         stderr=subprocess.PIPE, **kwargs)
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Create a subprocess from *cmd*, which can be a :class:`str` or a
 | 
					
						
							|  |  |  |    :class:`bytes` string encoded to the
 | 
					
						
							|  |  |  |    :ref:`filesystem encoding <filesystem-encoding>`,
 | 
					
						
							|  |  |  |    using the platform's "shell" syntax.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is similar to the standard library :class:`subprocess.Popen`
 | 
					
						
							|  |  |  |    class called with ``shell=True``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    The *protocol_factory* must be a callable returning a subclass of the
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    :class:`SubprocessProtocol` class.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    See :meth:`~loop.subprocess_exec` for more details about
 | 
					
						
							|  |  |  |    the remaining arguments.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Returns a pair of ``(transport, protocol)``, where *transport*
 | 
					
						
							| 
									
										
										
										
											2018-09-16 19:40:44 -04:00
										 |  |  |    conforms to the :class:`SubprocessTransport` base class and
 | 
					
						
							|  |  |  |    *protocol* is an object instantiated by the *protocol_factory*.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. note::
 | 
					
						
							|  |  |  |    It is the application's responsibility to ensure that all whitespace
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    and special characters are quoted appropriately to avoid `shell injection
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    <https://en.wikipedia.org/wiki/Shell_injection#Shell_injection>`_
 | 
					
						
							|  |  |  |    vulnerabilities. The :func:`shlex.quote` function can be used to
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    properly escape whitespace and special characters in strings that
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    are going to be used to construct shell commands.
 | 
					
						
							| 
									
										
										
										
											2014-07-11 23:47:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | Callback Handles
 | 
					
						
							|  |  |  | ================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: Handle
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    A callback wrapper object returned by :meth:`loop.call_soon`,
 | 
					
						
							|  |  |  |    :meth:`loop.call_soon_threadsafe`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-04 23:49:10 -07:00
										 |  |  |    .. method:: get_context()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return the :class:`contextvars.Context` object
 | 
					
						
							|  |  |  |       associated with the handle.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.12
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    .. method:: cancel()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       Cancel the callback.  If the callback has already been canceled
 | 
					
						
							|  |  |  |       or executed, this method has no effect.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: cancelled()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       Return ``True`` if the callback was cancelled.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: TimerHandle
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    A callback wrapper object returned by :meth:`loop.call_later`,
 | 
					
						
							|  |  |  |    and :meth:`loop.call_at`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    This class is a subclass of :class:`Handle`.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: when()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return a scheduled callback time as :class:`float` seconds.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The time is an absolute timestamp, using the same time
 | 
					
						
							|  |  |  |       reference as :meth:`loop.time`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Server Objects
 | 
					
						
							|  |  |  | ==============
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Server objects are created by :meth:`loop.create_server`,
 | 
					
						
							|  |  |  | :meth:`loop.create_unix_server`, :func:`start_server`,
 | 
					
						
							|  |  |  | and :func:`start_unix_server` functions.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 06:32:24 -06:00
										 |  |  | Do not instantiate the :class:`Server` class directly.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. class:: Server
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    *Server* objects are asynchronous context managers.  When used in an
 | 
					
						
							|  |  |  |    ``async with`` statement, it's guaranteed that the Server object is
 | 
					
						
							|  |  |  |    closed and not accepting new connections when the ``async with``
 | 
					
						
							|  |  |  |    statement is completed::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       srv = await loop.create_server(...)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async with srv:
 | 
					
						
							|  |  |  |           # some code
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |       # At this point, srv is closed and no longer accepts new connections.
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Server object is an asynchronous context manager since Python 3.7.
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-19 15:56:26 -04:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       This class was exposed publicly as ``asyncio.Server`` in Python 3.9.11, 3.10.3 and 3.11.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  |    .. method:: close()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-12 03:20:24 +02:00
										 |  |  |       Stop serving: close listening sockets and set the :attr:`sockets`
 | 
					
						
							|  |  |  |       attribute to ``None``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       The sockets that represent existing incoming client connections
 | 
					
						
							|  |  |  |       are left open.
 | 
					
						
							| 
									
										
										
										
											2014-07-11 23:47:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-28 11:04:29 -07:00
										 |  |  |       The server is closed asynchronously; use the :meth:`wait_closed`
 | 
					
						
							|  |  |  |       coroutine to wait until the server is closed (and no more
 | 
					
						
							|  |  |  |       connections are active).
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 21:15:53 +01:00
										 |  |  |    .. method:: close_clients()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Close all existing incoming client connections.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Calls :meth:`~asyncio.BaseTransport.close` on all associated
 | 
					
						
							|  |  |  |       transports.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       :meth:`close` should be called before :meth:`close_clients` when
 | 
					
						
							|  |  |  |       closing the server to avoid races with new clients connecting.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.13
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: abort_clients()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Close all existing incoming client connections immediately,
 | 
					
						
							|  |  |  |       without waiting for pending operations to complete.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Calls :meth:`~asyncio.WriteTransport.abort` on all associated
 | 
					
						
							|  |  |  |       transports.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       :meth:`close` should be called before :meth:`abort_clients` when
 | 
					
						
							|  |  |  |       closing the server to avoid races with new clients connecting.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.13
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 20:39:32 +05:30
										 |  |  |    .. method:: get_loop()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       Return the event loop associated with the server object.
 | 
					
						
							| 
									
										
										
										
											2017-12-30 20:39:32 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  |    .. coroutinemethod:: start_serving()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Start accepting connections.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method is idempotent, so it can be called when
 | 
					
						
							| 
									
										
										
										
											2021-06-02 08:00:25 -07:00
										 |  |  |       the server is already serving.
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       The *start_serving* keyword-only parameter to
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       :meth:`loop.create_server` and
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       :meth:`asyncio.start_server` allows creating a Server object
 | 
					
						
							|  |  |  |       that is not accepting connections initially.  In this case
 | 
					
						
							|  |  |  |       ``Server.start_serving()``, or :meth:`Server.serve_forever` can be used
 | 
					
						
							|  |  |  |       to make the Server start accepting connections.
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. coroutinemethod:: serve_forever()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Start accepting connections until the coroutine is cancelled.
 | 
					
						
							|  |  |  |       Cancellation of ``serve_forever`` task causes the server
 | 
					
						
							|  |  |  |       to be closed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method can be called if the server is already accepting
 | 
					
						
							|  |  |  |       connections.  Only one ``serve_forever`` task can exist per
 | 
					
						
							|  |  |  |       one *Server* object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           async def client_connected(reader, writer):
 | 
					
						
							|  |  |  |               # Communicate with the client with
 | 
					
						
							|  |  |  |               # reader/writer streams.  For example:
 | 
					
						
							|  |  |  |               await reader.readline()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           async def main(host, port):
 | 
					
						
							|  |  |  |               srv = await asyncio.start_server(
 | 
					
						
							|  |  |  |                   client_connected, host, port)
 | 
					
						
							| 
									
										
										
										
											2018-02-17 19:44:35 +02:00
										 |  |  |               await srv.serve_forever()
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |           asyncio.run(main('127.0.0.1', 0))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: is_serving()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return ``True`` if the server is accepting new connections.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  |    .. coroutinemethod:: wait_closed()
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-28 11:04:29 -07:00
										 |  |  |       Wait until the :meth:`close` method completes and all active
 | 
					
						
							|  |  |  |       connections have finished.
 | 
					
						
							| 
									
										
										
										
											2014-07-11 23:47:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. attribute:: sockets
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 06:32:24 -06:00
										 |  |  |       List of socket-like objects, ``asyncio.trsock.TransportSocket``, which
 | 
					
						
							|  |  |  |       the server is listening on.
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  |       .. versionchanged:: 3.7
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |          Prior to Python 3.7 ``Server.sockets`` used to return an
 | 
					
						
							|  |  |  |          internal list of server sockets directly.  In 3.7 a copy
 | 
					
						
							| 
									
										
										
										
											2018-01-25 18:08:09 -05:00
										 |  |  |          of that list is returned.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 18:11:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. _asyncio-event-loops:
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  | .. _asyncio-event-loop-implementations:
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | Event Loop Implementations
 | 
					
						
							|  |  |  | ==========================
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | asyncio ships with two different event loop implementations:
 | 
					
						
							|  |  |  | :class:`SelectorEventLoop` and :class:`ProactorEventLoop`.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-12 07:13:57 -07:00
										 |  |  | By default asyncio is configured to use :class:`EventLoop`.
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-08 23:42:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. class:: SelectorEventLoop
 | 
					
						
							| 
									
										
										
										
											2017-11-07 12:06:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-12 07:13:57 -07:00
										 |  |  |    A subclass of :class:`AbstractEventLoop` based on the
 | 
					
						
							|  |  |  |    :mod:`selectors` module.
 | 
					
						
							| 
									
										
										
										
											2017-11-07 12:06:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Uses the most efficient *selector* available for the given
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    platform.  It is also possible to manually configure the
 | 
					
						
							|  |  |  |    exact selector implementation to be used::
 | 
					
						
							| 
									
										
										
										
											2017-11-07 12:06:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |       import asyncio
 | 
					
						
							|  |  |  |       import selectors
 | 
					
						
							| 
									
										
										
										
											2018-02-01 19:59:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 20:43:41 +05:30
										 |  |  |       async def main():
 | 
					
						
							|  |  |  |          ...
 | 
					
						
							| 
									
										
										
										
											2022-10-04 22:15:37 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 20:43:41 +05:30
										 |  |  |       loop_factory = lambda: asyncio.SelectorEventLoop(selectors.SelectSelector())
 | 
					
						
							|  |  |  |       asyncio.run(main(), loop_factory=loop_factory)
 | 
					
						
							| 
									
										
										
										
											2018-02-01 19:59:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Unix, Windows.
 | 
					
						
							| 
									
										
										
										
											2018-02-01 19:59:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. class:: ProactorEventLoop
 | 
					
						
							| 
									
										
										
										
											2018-02-01 19:59:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-12 07:13:57 -07:00
										 |  |  |    A subclass of :class:`AbstractEventLoop` for Windows that uses "I/O Completion Ports" (IOCP).
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-12 10:55:20 -04:00
										 |  |  |    .. availability:: Windows.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       `MSDN documentation on I/O Completion Ports
 | 
					
						
							| 
									
										
										
										
											2024-11-12 01:10:49 +08:00
										 |  |  |       <https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports>`_.
 | 
					
						
							| 
									
										
										
										
											2018-02-01 19:59:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-12 07:13:57 -07:00
										 |  |  | .. class:: EventLoop
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An alias to the most efficient available subclass of :class:`AbstractEventLoop` for the given
 | 
					
						
							|  |  |  |     platform.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     It is an alias to :class:`SelectorEventLoop` on Unix and :class:`ProactorEventLoop` on Windows.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.13
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | .. class:: AbstractEventLoop
 | 
					
						
							| 
									
										
										
										
											2018-01-19 20:04:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    Abstract base class for asyncio-compliant event loops.
 | 
					
						
							| 
									
										
										
										
											2018-01-19 20:04:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-27 18:47:14 -05:00
										 |  |  |    The :ref:`asyncio-event-loop-methods` section lists all
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    methods that an alternative implementation of ``AbstractEventLoop``
 | 
					
						
							|  |  |  |    should have defined.
 | 
					
						
							| 
									
										
										
										
											2018-01-19 20:04:29 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Examples
 | 
					
						
							|  |  |  | ========
 | 
					
						
							| 
									
										
										
										
											2018-01-19 20:04:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | Note that all examples in this section **purposefully** show how
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | to use the low-level event loop APIs, such as :meth:`loop.run_forever`
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | and :meth:`loop.call_soon`.  Modern asyncio applications rarely
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | need to be written this way; consider using the high-level functions
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | like :func:`asyncio.run`.
 | 
					
						
							| 
									
										
										
										
											2018-01-19 20:04:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 20:58:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  | .. _asyncio_example_lowlevel_helloworld:
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | Hello World with call_soon()
 | 
					
						
							| 
									
										
										
										
											2015-01-09 15:58:41 +01:00
										 |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | An example using the :meth:`loop.call_soon` method to schedule a
 | 
					
						
							|  |  |  | callback. The callback displays ``"Hello World"`` and then stops the
 | 
					
						
							|  |  |  | event loop::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  |     def hello_world(loop):
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |         """A callback to print 'Hello World' and stop the event loop"""
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  |         print('Hello World')
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  |         loop.stop()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-12 04:56:30 +09:00
										 |  |  |     loop = asyncio.new_event_loop()
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Schedule a call to hello_world()
 | 
					
						
							|  |  |  |     loop.call_soon(hello_world, loop)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Blocking call interrupted by loop.stop()
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     try:
 | 
					
						
							|  |  |  |         loop.run_forever()
 | 
					
						
							|  |  |  |     finally:
 | 
					
						
							|  |  |  |         loop.close()
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:22:06 +01:00
										 |  |  | .. seealso::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    A similar :ref:`Hello World <coroutine>`
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    example created with a coroutine and the :func:`run` function.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  | .. _asyncio_example_call_later:
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Display the current date with call_later()
 | 
					
						
							| 
									
										
										
										
											2015-01-09 15:58:41 +01:00
										 |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | An example of a callback displaying the current date every second. The
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | callback uses the :meth:`loop.call_later` method to reschedule itself
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | after 5 seconds, and then stops the event loop::
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							|  |  |  |     import datetime
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def display_date(end_time, loop):
 | 
					
						
							|  |  |  |         print(datetime.datetime.now())
 | 
					
						
							|  |  |  |         if (loop.time() + 1.0) < end_time:
 | 
					
						
							|  |  |  |             loop.call_later(1, display_date, end_time, loop)
 | 
					
						
							|  |  |  |         else:
 | 
					
						
							|  |  |  |             loop.stop()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-12 04:56:30 +09:00
										 |  |  |     loop = asyncio.new_event_loop()
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Schedule the first call to display_date()
 | 
					
						
							|  |  |  |     end_time = loop.time() + 5.0
 | 
					
						
							|  |  |  |     loop.call_soon(display_date, end_time, loop)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Blocking call interrupted by loop.stop()
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     try:
 | 
					
						
							|  |  |  |         loop.run_forever()
 | 
					
						
							|  |  |  |     finally:
 | 
					
						
							|  |  |  |         loop.close()
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 15:11:24 -07:00
										 |  |  |    A similar :ref:`current date <asyncio_example_sleep>` example
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |    created with a coroutine and the :func:`run` function.
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  | .. _asyncio_example_watch_fd:
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Watch a file descriptor for read events
 | 
					
						
							| 
									
										
										
										
											2015-01-09 15:58:41 +01:00
										 |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Wait until a file descriptor received some data using the
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | :meth:`loop.add_reader` method and then close the event loop::
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							| 
									
										
										
										
											2017-11-28 21:33:20 +01:00
										 |  |  |     from socket import socketpair
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create a pair of connected file descriptors
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:30:02 +02:00
										 |  |  |     rsock, wsock = socketpair()
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-12 04:56:30 +09:00
										 |  |  |     loop = asyncio.new_event_loop()
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def reader():
 | 
					
						
							|  |  |  |         data = rsock.recv(100)
 | 
					
						
							|  |  |  |         print("Received:", data.decode())
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 22:38:46 +02:00
										 |  |  |         # We are done: unregister the file descriptor
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  |         loop.remove_reader(rsock)
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  |         # Stop the event loop
 | 
					
						
							|  |  |  |         loop.stop()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 22:38:46 +02:00
										 |  |  |     # Register the file descriptor for read event
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  |     loop.add_reader(rsock, reader)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Simulate the reception of data from the network
 | 
					
						
							|  |  |  |     loop.call_soon(wsock.send, 'abc'.encode())
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     try:
 | 
					
						
							|  |  |  |         # Run the event loop
 | 
					
						
							|  |  |  |         loop.run_forever()
 | 
					
						
							|  |  |  |     finally:
 | 
					
						
							| 
									
										
										
										
											2018-09-12 17:05:17 -07:00
										 |  |  |         # We are done. Close sockets and the event loop.
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |         rsock.close()
 | 
					
						
							|  |  |  |         wsock.close()
 | 
					
						
							|  |  |  |         loop.close()
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. seealso::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  |    * A similar :ref:`example <asyncio_example_create_connection>`
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |      using transports, protocols, and the
 | 
					
						
							|  |  |  |      :meth:`loop.create_connection` method.
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  |    * Another similar :ref:`example <asyncio_example_create_connection-streams>`
 | 
					
						
							| 
									
										
										
										
											2019-09-29 21:59:55 -07:00
										 |  |  |      using the high-level :func:`asyncio.open_connection` function
 | 
					
						
							|  |  |  |      and streams.
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  | .. _asyncio_example_unix_signals:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | Set signal handlers for SIGINT and SIGTERM
 | 
					
						
							| 
									
										
										
										
											2015-01-09 15:58:41 +01:00
										 |  |  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
					
						
							| 
									
										
										
										
											2014-10-11 16:16:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | (This ``signals`` example only works on Unix.)
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-29 22:31:01 +03:00
										 |  |  | Register handlers for signals :const:`~signal.SIGINT` and :const:`~signal.SIGTERM`
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | using the :meth:`loop.add_signal_handler` method::
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							|  |  |  |     import functools
 | 
					
						
							|  |  |  |     import os
 | 
					
						
							|  |  |  |     import signal
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-03 18:25:36 +03:00
										 |  |  |     def ask_exit(signame, loop):
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  |         print("got signal %s: exit" % signame)
 | 
					
						
							|  |  |  |         loop.stop()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     async def main():
 | 
					
						
							|  |  |  |         loop = asyncio.get_running_loop()
 | 
					
						
							| 
									
										
										
										
											2014-01-27 10:07:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |         for signame in {'SIGINT', 'SIGTERM'}:
 | 
					
						
							|  |  |  |             loop.add_signal_handler(
 | 
					
						
							|  |  |  |                 getattr(signal, signame),
 | 
					
						
							| 
									
										
										
										
											2019-05-03 18:25:36 +03:00
										 |  |  |                 functools.partial(ask_exit, signame, loop))
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         await asyncio.sleep(3600)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     print("Event loop running for 1 hour, press Ctrl+C to interrupt.")
 | 
					
						
							|  |  |  |     print(f"pid {os.getpid()}: send SIGINT or SIGTERM to exit.")
 | 
					
						
							| 
									
										
										
										
											2014-10-23 22:38:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 09:54:40 -07:00
										 |  |  |     asyncio.run(main())
 |