Расширение
Основное направление расширения 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–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/asyncio-extending.html