# Extensão

A direção principal para estender o módulo `asyncio` é escrever classes de laços de eventos personalizados. O Asyncio tem funções auxiliares que podem ser usadas para simplificar essa tarefa.

Nota

Terceiros devem reutilizar o código assíncrono existente com cuidado. Uma versão nova de Python pode quebrar a compatibilidade com versões anteriores da parte interna da API.

## Escrevendo um laço de eventos personalizado

`asyncio.AbstractEventLoop` declara muitos métodos. Implementar todos eles do zero é um trabalho tedioso.

Um laço de eventos pode herdar várias implementações de métodos da classe `asyncio.BaseEventLoop`.

Por sua vez, o sucessor deve implementar um conjunto de métodos privados declarados, porém não implementados, em `asyncio.BaseEventLoop`.

Por exemplo, `loop.create_connection()``verifica os argumentos, resolve endereços DNS, e chama a função ``loop._make_socket_transport()`, que deve ser implementada pela classe herdada. O método``_make_socket_transport()`` não está documentado, e é considerado parte de uma API interna.

## Construtores privados de Future e Task

As classes `asyncio.Future` e `asyncio.Task` nunca deverão ser criadas diretamente. Por favor, as substitua pelas factories correspondentes: `loop.create_future()` e `loop.create_task()` ou `asyncio.create_task()`.

Porém, laços de eventos de terceiros podem reutilizar as implementações embutidas de Future e Task, obtendo um código complexo e altamente otimizado.

Por isso, segue a listagem de construtores privados:

Future.__init__(*, loop=None)

  Cria uma instância de Future embutida.

  loop é uma instância opcional do laço de eventos.

Task.__init__(coro, *, loop=None, name=None, context=None)

  Cria uma instância embutida de Task.

  loop é uma instância opcional do laço de eventos. Os outros argumentos estão descritos em `loop.create_task()`.

  Alterado na versão 3.11: o argumento context foi adicionado

## Suporte ao ciclo de vida de tarefas

Implementações de Task de terceiros devem chamar as seguintes funções para manter uma tarefa visível para `asyncio.all_tasks()` e `asyncio.current_task()`:

asyncio._register_task(task)

  Registra uma nova task como gerenciada pelo asyncio.

  Chame esta função no construtor de uma tarefa.

asyncio._unregister_task(task)

  Cancela o registro de task nas estruturas internas do asyncio.

  Chame esta função quando a tarefa estiver terminando.

asyncio._enter_task(loop, task)

  Troca a tarefa atual para o argumento task.

  Chame esta função logo antes de executar uma porção da corrotina embutida (`coroutine.send()` ou `coroutine.throw()`).

asyncio._leave_task(loop, task)

  Troca a tarefa atual de task para `None`.

  Chame esta função logo após executar `coroutine.send()` ou `coroutine.throw()`.