Расширение
Основное направление расширения 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) -
Переключает текущую задачу на задачу-аргумент.
Вызов функции непосредственно перед выполнением части вложенного корутина (
coroutine.send()илиcoroutine.throw()).
-
asyncio._leave_task(loop, task) -
Переключает текущую задачу обратно с задачи на
None.Вызов функции сразу после выполнения
coroutine.send()илиcoroutine.throw().
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/asyncio-extending.html