Содержание страницы
Расширение¶Extending
Основное направление asyncio расширения – написание собственных классов цикла событий.
Asyncio предоставляет вспомогательные средства, которые можно использовать для упрощения этой задачи.
Примечание
Сторонним разработчикам следует с осторожностью использовать существующий код asyncio: новая версия Python может нарушить обратную совместимость в внутренней части API.
Написание собственного цикла событий¶Writing a Custom Event Loop
asyncio.AbstractEventLoop объявляет очень много методов. Реализовывать их все
с нуля – утомительная работа.
Цикл событий может бесплатно получить реализацию многих общих методов, унаследовав от
asyncio.BaseEventLoop.
В свою очередь, наследник должен реализовать ряд закрытых методов, объявленных, но не
реализованных в asyncio.BaseEventLoop.
Например, loop.create_connection() проверяет аргументы, разрешает DNS-адреса и
вызывает loop._make_socket_transport(), который должен быть реализован классом-наследником.
Метод _make_socket_transport() не документирован и считается внутренним API.
Закрытые конструкторы Future и Task¶Future and Task private constructors
asyncio.Future и asyncio.Task никогда не должны создаваться напрямую;
вместо этого используйте соответствующие фабрики loop.create_future() и loop.create_task()
или asyncio.create_task().
Однако сторонние циклы событий могут повторно использовать встроенные реализации future и задач, чтобы бесплатно получить сложный и высокооптимизированный код.
Для этой цели перечислены следующие закрытые конструкторы:
- Future.__init__(*, loop=None)¶
Создаёт встроенный экземпляр future.
loop – необязательный экземпляр цикла событий.
- Task.__init__(coro, *, loop=None, name=None, context=None)¶
Создаёт встроенный экземпляр task.
loop – необязательный экземпляр цикла событий. Остальные аргументы описаны в описании
loop.create_task().Изменено в версии 3.11: добавлен аргумент context.
Поддержка времени жизни задачи¶Task lifetime support
Реализация задачи от стороннего разработчика должна вызывать следующие функции, чтобы задача
оставалась видимой для 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)¶
Переключить текущую задачу обратно с задачи на
None.Функция вызывается сразу после выполнения
coroutine.send()илиcoroutine.throw().