# Extension

La direction principale pour l'extension d'`asyncio` est l'écriture de classes event loop personnalisées. Asyncio a des assistants qui peuvent être utilisés pour simplifier cette tâche.

Note

la réutilisation du code asynchrone existant doit se faire avec prudence, une nouvelle version de Python est libre de rompre la compatibilité descendante dans la partie interne de l'API.

## Écriture d'une boucle d'événements personnalisée

`asyncio.AbstractEventLoop` déclare de très nombreuses méthodes. Les mettre en œuvre à partir de zéro est un travail fastidieux.

Une boucle d'événements peut obtenir gratuitement l'implémentation de nombreuses méthodes courantes en héritant de `asyncio.BaseEventLoop`.

Le successeur doit, pour ce qui le concerne, implémenter un ensemble de méthodes privées déclarées mais non implémentées dans `asyncio.BaseEventLoop`.

Par exemple, `loop.create_connection()` vérifie les arguments, résout les adresses DNS et appelle `loop._make_socket_transport()` qui doit être implémentée par la classe héritée. La méthode `_make_socket_transport()` n'est pas documentée et est considérée comme une API interne.

## Constructeurs privés Future et Task

`asyncio.Future` et `asyncio.Task` ne doivent jamais être créées directement, veuillez utiliser les correspondances `loop.create_future()` et `loop.create_task()`, ou les fabriques `asyncio.create_task()` à la place.

Cependant, les boucles d'événements tierces peuvent réutiliser les implémentations de Future et de Task intégrées dans le but d'obtenir gratuitement un code complexe et hautement optimisé.

À cette fin, les constructeurs privés suivants sont répertoriés :

Future.__init__(*, loop=None)

  Crée une instance de la future native.

  loop est une instance de boucle d'événements facultative.

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

  Crée une instance de la Task native.

  loop est une instance de boucle d'événements facultative. Le reste des arguments est décrit dans la description de `loop.create_task()`.

  Modifié dans la version 3.11: l'argument contexte a été ajouté.

## Prise en charge de la durée de vie des tâches

A third party task implementation should call the following functions to keep a task visible by `asyncio.all_tasks()` and `asyncio.current_task()`:

asyncio._register_task(task)

  Enregistre une nouvelle tâche comme gérée par asyncio.

  Appelez la fonction à partir d'un constructeur de tâche.

asyncio._unregister_task(task)

  Désinscrit une tâche des structures internes asyncio.

  La fonction doit être appelée lorsqu'une tâche est sur le point de se terminer.

asyncio._enter_task(loop, task)

  Bascule la tâche en cours vers l'argument task.

  Appelez la fonction juste avant d'exécuter une partie de la coroutine intégrée (`coroutine.send()` ou `coroutine.throw()`).

asyncio._leave_task(loop, task)

  Rebascule la tâche en cours de task à `None`.

  Appelez la fonction juste après l'exécution de `coroutine.send()` ou `coroutine.throw()`.