> **Источник:** https://python-all.ru/3/library/asyncio-extending.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Расширение

Основное направление [`asyncio`](https://python-all.ru/3/library/asyncio.html#module-asyncio) расширения – написание собственных классов *цикла событий*. Asyncio предоставляет вспомогательные средства, которые можно использовать для упрощения этой задачи.

> **Примечание**
>
> Сторонним разработчикам следует с осторожностью использовать существующий код asyncio: новая версия Python может нарушить обратную совместимость в *внутренней* части API.

## Написание собственного цикла событий

[`asyncio.AbstractEventLoop`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.AbstractEventLoop) объявляет очень много методов. Реализовывать их все с нуля – утомительная работа.

Цикл событий может бесплатно получить реализацию многих общих методов, унаследовав от `asyncio.BaseEventLoop`.

В свою очередь, наследник должен реализовать ряд *закрытых* методов, объявленных, но не реализованных в `asyncio.BaseEventLoop`.

Например, `loop.create_connection()` проверяет аргументы, разрешает DNS-адреса и вызывает `loop._make_socket_transport()`, который должен быть реализован классом-наследником. Метод `_make_socket_transport()` не документирован и считается *внутренним* API.

## Закрытые конструкторы Future и Task

[`asyncio.Future`](https://python-all.ru/3/library/asyncio-future.html#asyncio.Future) и [`asyncio.Task`](https://python-all.ru/3/library/asyncio-task.html#asyncio.Task) никогда не должны создаваться напрямую; вместо этого используйте соответствующие фабрики [`loop.create_future()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.create_future) и [`loop.create_task()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.create_task) или [`asyncio.create_task()`](https://python-all.ru/3/library/asyncio-task.html#asyncio.create_task).

Однако сторонние *циклы событий* могут *повторно использовать* встроенные реализации future и задач, чтобы бесплатно получить сложный и высокооптимизированный код.

Для этой цели перечислены следующие *закрытые* конструкторы:

#### `Future.__init__(*, loop=None)`

Создаёт встроенный экземпляр future.

*loop* – необязательный экземпляр цикла событий.

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

Создаёт встроенный экземпляр task.

*loop* – необязательный экземпляр цикла событий. Остальные аргументы описаны в описании [`loop.create_task()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.loop.create_task).

Изменено в версии 3.11: добавлен аргумент *context*.

## Поддержка времени жизни задачи

Реализация задачи от стороннего разработчика должна вызывать следующие функции, чтобы задача оставалась видимой для [`asyncio.all_tasks()`](https://python-all.ru/3/library/asyncio-task.html#asyncio.all_tasks) и [`asyncio.current_task()`](https://python-all.ru/3/library/asyncio-task.html#asyncio.current_task):

#### `asyncio._register_task(task)`

Регистрирует новую *задачу* как управляемую *asyncio*.

Вызывайте эту функцию из конструктора задачи.

#### `asyncio._unregister_task(task)`

Удаляет *задачу* из внутренних структур *asyncio*.

Функцию следует вызывать, когда задача вот-вот завершится.

#### `asyncio._enter_task(loop, task)`

Переключает текущую задачу на аргумент *task*.

Функция вызывается непосредственно перед выполнением части встроенной *корутины* ([`coroutine.send()`](https://python-all.ru/3/reference/datamodel.html#coroutine.send) или [`coroutine.throw()`](https://python-all.ru/3/reference/datamodel.html#coroutine.throw)).

#### `asyncio._leave_task(loop, task)`

Переключить текущую задачу обратно с *задачи* на `None`.

Функция вызывается сразу после выполнения [`coroutine.send()`](https://python-all.ru/3/reference/datamodel.html#coroutine.send) или [`coroutine.throw()`](https://python-all.ru/3/reference/datamodel.html#coroutine.throw) .
