Spec-Zone.ru › Python 3.12

Расширение

Основное направление расширения asyncio — написание пользовательских классов цикла событий. В asyncio есть вспомогательные средства, которые упрощают эту задачу.

Примечание

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

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

asyncio.AbstractEventLoop объявляет очень много методов. Реализовывать все их с нуля — утомительная задача.

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

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

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

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

asyncio.Future и asyncio.Task никогда не следует создавать напрямую. Вместо этого используйте соответствующие фабричные методы loop.create_future() и loop.create_task() или фабричный метод asyncio.create_task().

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

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

Future.__init__(*, loop=None)

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

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

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

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

loop — необязательный экземпляр цикла событий. Остальные аргументы описаны в документации к loop.create_task().

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

Поддержка жизненного цикла задач

Сторонняя реализация task должна вызывать следующие функции, чтобы задача оставалась видимой для asyncio.all_tasks() и asyncio.current_task():

asyncio._register_task(task)

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

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

asyncio._unregister_task(task)

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

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

asyncio._enter_task(loop, task)

Переключить текущую задачу на задачу, переданную в аргументе task.

Вызовите функцию непосредственно перед выполнением части встроенной корутины (coroutine.send() или coroutine.throw()).

asyncio._leave_task(loop, task)

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

Вызовите функцию сразу после выполнения coroutine.send() или coroutine.throw().

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/asyncio-extending.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API