.. 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/Interpreter/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.
