.. currentmodule:: asyncio


===================
Low-level API Index
===================

This page lists all low-level asyncio APIs.


Obtaining the Event Loop
========================

.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :func:`asyncio.get_running_loop`
      - The **preferred** function to get the running event loop.

    * - :func:`asyncio.get_event_loop`
      - Get an event loop instance (running or current via the current policy).

    * - :func:`asyncio.set_event_loop`
      - Set the event loop as current via the current policy.

    * - :func:`asyncio.new_event_loop`
      - Create a new event loop.


.. rubric:: Examples

* :ref:`Using asyncio.get_running_loop() <asyncio_example_future>`.


Event Loop Methods
==================

See also the main documentation section about the
:ref:`asyncio-event-loop-methods`.

.. rubric:: Lifecycle
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`loop.run_until_complete`
      - Run a Future/Task/awaitable until complete.

    * - :meth:`loop.run_forever`
      - Run the event loop forever.

    * - :meth:`loop.stop`
      - Stop the event loop.

    * - :meth:`loop.close`
      - Close the event loop.

    * - :meth:`loop.is_running()`
      - Return ``True`` if the event loop is running.

    * - :meth:`loop.is_closed()`
      - Return ``True`` if the event loop is closed.

    * - ``await`` :meth:`loop.shutdown_asyncgens`
      - Close asynchronous generators.


.. rubric:: Debugging
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`loop.set_debug`
      - Enable or disable the debug mode.

    * - :meth:`loop.get_debug`
      - Get the current debug mode.


.. rubric:: Scheduling Callbacks
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`loop.call_soon`
      - Invoke a callback soon.

    * - :meth:`loop.call_soon_threadsafe`
      - A thread-safe variant of :meth:`loop.call_soon`.

    * - :meth:`loop.call_later`
      - Invoke a callback *after* the given time.

    * - :meth:`loop.call_at`
      - Invoke a callback *at* the given time.


.. rubric:: Thread/Process Pool
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``await`` :meth:`loop.run_in_executor`
      - Run a CPU-bound or other blocking function in
        a :mod:`concurrent.futures` executor.

    * - :meth:`loop.set_default_executor`
      - Set the default executor for :meth:`loop.run_in_executor`.


.. rubric:: Tasks and Futures
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`loop.create_future`
      - Create a :class:`Future` object.

    * - :meth:`loop.create_task`
      - Schedule coroutine as a :class:`Task`.

    * - :meth:`loop.set_task_factory`
      - Set a factory used by :meth:`loop.create_task` to
        create :class:`Tasks <Task>`.

    * - :meth:`loop.get_task_factory`
      - Get the factory :meth:`loop.create_task` uses
        to create :class:`Tasks <Task>`.


.. rubric:: DNS
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``await`` :meth:`loop.getaddrinfo`
      - Asynchronous version of :meth:`socket.getaddrinfo`.

    * - ``await`` :meth:`loop.getnameinfo`
      - Asynchronous version of :meth:`socket.getnameinfo`.


.. rubric:: Networking and IPC
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``await`` :meth:`loop.create_connection`
      - Open a TCP connection.

    * - ``await`` :meth:`loop.create_server`
      - Create a TCP server.

    * - ``await`` :meth:`loop.create_unix_connection`
      - Open a Unix socket connection.

    * - ``await`` :meth:`loop.create_unix_server`
      - Create a Unix socket server.

    * - ``await`` :meth:`loop.connect_accepted_socket`
      - Wrap a :class:`~socket.socket` into a ``(transport, protocol)``
        pair.

    * - ``await`` :meth:`loop.create_datagram_endpoint`
      - Open a datagram (UDP) connection.

    * - ``await`` :meth:`loop.sendfile`
      - Send a file over a transport.

    * - ``await`` :meth:`loop.start_tls`
      - Upgrade an existing connection to TLS.

    * - ``await`` :meth:`loop.connect_read_pipe`
      - Wrap a read end of a pipe into a ``(transport, protocol)`` pair.

    * - ``await`` :meth:`loop.connect_write_pipe`
      - Wrap a write end of a pipe into a ``(transport, protocol)`` pair.


.. rubric:: Sockets
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``await`` :meth:`loop.sock_recv`
      - Receive data from the :class:`~socket.socket`.

    * - ``await`` :meth:`loop.sock_recv_into`
      - Receive data from the :class:`~socket.socket` into a buffer.

    * - ``await`` :meth:`loop.sock_recvfrom`
      - Receive a datagram from the :class:`~socket.socket`.

    * - ``await`` :meth:`loop.sock_recvfrom_into`
      - Receive a datagram from the :class:`~socket.socket` into a buffer.

    * - ``await`` :meth:`loop.sock_sendall`
      - Send data to the :class:`~socket.socket`.

    * - ``await`` :meth:`loop.sock_sendto`
      - Send a datagram via the :class:`~socket.socket` to the given address.

    * - ``await`` :meth:`loop.sock_connect`
      - Connect the :class:`~socket.socket`.

    * - ``await`` :meth:`loop.sock_accept`
      - Accept a :class:`~socket.socket` connection.

    * - ``await`` :meth:`loop.sock_sendfile`
      - Send a file over the :class:`~socket.socket`.

    * - :meth:`loop.add_reader`
      - Start watching a file descriptor for read availability.

    * - :meth:`loop.remove_reader`
      - Stop watching a file descriptor for read availability.

    * - :meth:`loop.add_writer`
      - Start watching a file descriptor for write availability.

    * - :meth:`loop.remove_writer`
      - Stop watching a file descriptor for write availability.


.. rubric:: Unix Signals
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`loop.add_signal_handler`
      - Add a handler for a :mod:`signal`.

    * - :meth:`loop.remove_signal_handler`
      - Remove a handler for a :mod:`signal`.


.. rubric:: Subprocesses
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`loop.subprocess_exec`
      - Spawn a subprocess.

    * - :meth:`loop.subprocess_shell`
      - Spawn a subprocess from a shell command.


.. rubric:: Error Handling
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`loop.call_exception_handler`
      - Call the exception handler.

    * - :meth:`loop.set_exception_handler`
      - Set a new exception handler.

    * - :meth:`loop.get_exception_handler`
      - Get the current exception handler.

    * - :meth:`loop.default_exception_handler`
      - The default exception handler implementation.


.. rubric:: Examples

* :ref:`Using asyncio.new_event_loop() and loop.run_forever()
  <asyncio_example_lowlevel_helloworld>`.

* :ref:`Using loop.call_later() <asyncio_example_call_later>`.

* Using ``loop.create_connection()`` to implement
  :ref:`an echo-client <asyncio_example_tcp_echo_client_protocol>`.

* Using ``loop.create_connection()`` to
  :ref:`connect a socket <asyncio_example_create_connection>`.

* :ref:`Using add_reader() to watch an FD for read events
  <asyncio_example_watch_fd>`.

* :ref:`Using loop.add_signal_handler() <asyncio_example_unix_signals>`.

* :ref:`Using loop.subprocess_exec() <asyncio_example_subprocess_proto>`.


Transports
==========

All transports implement the following methods:

.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`transport.close() <BaseTransport.close>`
      - Close the transport.

    * - :meth:`transport.is_closing() <BaseTransport.is_closing>`
      - Return ``True`` if the transport is closing or is closed.

    * - :meth:`transport.get_extra_info() <BaseTransport.get_extra_info>`
      - Request for information about the transport.

    * - :meth:`transport.set_protocol() <BaseTransport.set_protocol>`
      - Set a new protocol.

    * - :meth:`transport.get_protocol() <BaseTransport.get_protocol>`
      - Return the current protocol.


Transports that can receive data (TCP and Unix connections,
pipes, etc).  Returned from methods like
:meth:`loop.create_connection`, :meth:`loop.create_unix_connection`,
:meth:`loop.connect_read_pipe`, etc:

.. rubric:: Read Transports
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`transport.is_reading() <ReadTransport.is_reading>`
      - Return ``True`` if the transport is receiving.

    * - :meth:`transport.pause_reading() <ReadTransport.pause_reading>`
      - Pause receiving.

    * - :meth:`transport.resume_reading() <ReadTransport.resume_reading>`
      - Resume receiving.


Transports that can Send data (TCP and Unix connections,
pipes, etc).  Returned from methods like
:meth:`loop.create_connection`, :meth:`loop.create_unix_connection`,
:meth:`loop.connect_write_pipe`, etc:

.. rubric:: Write Transports
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`transport.write() <WriteTransport.write>`
      - Write data to the transport.

    * - :meth:`transport.writelines() <WriteTransport.writelines>`
      - Write buffers to the transport.

    * - :meth:`transport.can_write_eof() <WriteTransport.can_write_eof>`
      - Return :const:`True` if the transport supports sending EOF.

    * - :meth:`transport.write_eof() <WriteTransport.write_eof>`
      - Close and send EOF after flushing buffered data.

    * - :meth:`transport.abort() <WriteTransport.abort>`
      - Close the transport immediately.

    * - :meth:`transport.get_write_buffer_size()
        <WriteTransport.get_write_buffer_size>`
      - Return the current size of the output buffer.

    * - :meth:`transport.get_write_buffer_limits()
        <WriteTransport.get_write_buffer_limits>`
      - Return high and low water marks for write flow control.

    * - :meth:`transport.set_write_buffer_limits()
        <WriteTransport.set_write_buffer_limits>`
      - Set new high and low water marks for write flow control.


Transports returned by :meth:`loop.create_datagram_endpoint`:

.. rubric:: Datagram Transports
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`transport.sendto() <DatagramTransport.sendto>`
      - Send data to the remote peer.

    * - :meth:`transport.abort() <DatagramTransport.abort>`
      - Close the transport immediately.


Low-level transport abstraction over subprocesses.
Returned by :meth:`loop.subprocess_exec` and
:meth:`loop.subprocess_shell`:

.. rubric:: Subprocess Transports
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`transport.get_pid() <SubprocessTransport.get_pid>`
      - Return the subprocess process id.

    * - :meth:`transport.get_pipe_transport()
        <SubprocessTransport.get_pipe_transport>`
      - Return the transport for the requested communication pipe
        (*stdin*, *stdout*, or *stderr*).

    * - :meth:`transport.get_returncode() <SubprocessTransport.get_returncode>`
      - Return the subprocess return code.

    * - :meth:`transport.kill() <SubprocessTransport.kill>`
      - Kill the subprocess.

    * - :meth:`transport.send_signal() <SubprocessTransport.send_signal>`
      - Send a signal to the subprocess.

    * - :meth:`transport.terminate() <SubprocessTransport.terminate>`
      - Stop the subprocess.

    * - :meth:`transport.close() <SubprocessTransport.close>`
      - Kill the subprocess and close all pipes.


Protocols
=========

Protocol classes can implement the following **callback methods**:

.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``callback`` :meth:`connection_made() <BaseProtocol.connection_made>`
      - Called when a connection is made.

    * - ``callback`` :meth:`connection_lost() <BaseProtocol.connection_lost>`
      - Called when the connection is lost or closed.

    * - ``callback`` :meth:`pause_writing() <BaseProtocol.pause_writing>`
      - Called when the transport's buffer goes over the high water mark.

    * - ``callback`` :meth:`resume_writing() <BaseProtocol.resume_writing>`
      - Called when the transport's buffer drains below the low water mark.


.. rubric:: Streaming Protocols (TCP, Unix Sockets, Pipes)
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``callback`` :meth:`data_received() <Protocol.data_received>`
      - Called when some data is received.

    * - ``callback`` :meth:`eof_received() <Protocol.eof_received>`
      - Called when an EOF is received.


.. rubric:: Buffered Streaming Protocols
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``callback`` :meth:`get_buffer() <BufferedProtocol.get_buffer>`
      - Called to allocate a new receive buffer.

    * - ``callback`` :meth:`buffer_updated() <BufferedProtocol.buffer_updated>`
      - Called when the buffer was updated with the received data.

    * - ``callback`` :meth:`eof_received() <BufferedProtocol.eof_received>`
      - Called when an EOF is received.


.. rubric:: Datagram Protocols
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``callback`` :meth:`datagram_received()
        <DatagramProtocol.datagram_received>`
      - Called when a datagram is received.

    * - ``callback`` :meth:`error_received() <DatagramProtocol.error_received>`
      - Called when a previous send or receive operation raises an
        :class:`OSError`.


.. rubric:: Subprocess Protocols
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - ``callback`` :meth:`~SubprocessProtocol.pipe_data_received`
      - Called when the child process writes data into its
        *stdout* or *stderr* pipe.

    * - ``callback`` :meth:`~SubprocessProtocol.pipe_connection_lost`
      - Called when one of the pipes communicating with
        the child process is closed.

    * - ``callback`` :meth:`process_exited()
        <SubprocessProtocol.process_exited>`
      - Called when the child process has exited. It can be called before
        :meth:`~SubprocessProtocol.pipe_data_received` and
        :meth:`~SubprocessProtocol.pipe_connection_lost` methods.


Event Loop Policies
===================

Policies is a low-level mechanism to alter the behavior of
functions like :func:`asyncio.get_event_loop`.  See also
the main :ref:`policies section <asyncio-policies>` for more
details.


.. rubric:: Accessing Policies
.. list-table::
    :widths: 50 50
    :class: full-width-table

    * - :meth:`asyncio.get_event_loop_policy`
      - Return the current process-wide policy.

    * - :meth:`asyncio.set_event_loop_policy`
      - Set a new process-wide policy.

    * - :class:`AbstractEventLoopPolicy`
      - Base class for policy objects.
