Документация Python неофициальный перевод

asyncio-extending.md

74 строк · 5.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.11/library/asyncio-extending.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Расширение89Основное направление [`asyncio`](https://python-all.ru/3.11/library/asyncio.html#module-asyncio) расширения – написание собственных классов *цикла событий*. Asyncio предоставляет вспомогательные средства, которые можно использовать для упрощения этой задачи.1011> **Примечание**12>13> Сторонним разработчикам следует с осторожностью использовать существующий код asyncio: новая версия Python может нарушить обратную совместимость в *внутренней* части API.1415## Написание собственного цикла событий1617[`asyncio.AbstractEventLoop`](https://python-all.ru/3.11/library/asyncio-eventloop.html#asyncio.AbstractEventLoop) объявляет очень много методов. Реализовывать их все с нуля – утомительная работа.1819Цикл событий может бесплатно получить реализацию многих общих методов, унаследовав от `asyncio.BaseEventLoop`.2021В свою очередь, наследник должен реализовать ряд *закрытых* методов, объявленных, но не реализованных в `asyncio.BaseEventLoop`.2223Например, `loop.create_connection()` проверяет аргументы, разрешает DNS-адреса и вызывает `loop._make_socket_transport()`, который должен быть реализован классом-наследником. Метод `_make_socket_transport()` не документирован и считается *внутренним* API.2425## Закрытые конструкторы Future и Task2627[`asyncio.Future`](https://python-all.ru/3.11/library/asyncio-future.html#asyncio.Future) и [`asyncio.Task`](https://python-all.ru/3.11/library/asyncio-task.html#asyncio.Task) никогда не должны создаваться напрямую; вместо этого используйте соответствующие фабрики [`loop.create_future()`](https://python-all.ru/3.11/library/asyncio-eventloop.html#asyncio.loop.create_future) и [`loop.create_task()`](https://python-all.ru/3.11/library/asyncio-eventloop.html#asyncio.loop.create_task) или [`asyncio.create_task()`](https://python-all.ru/3.11/library/asyncio-task.html#asyncio.create_task).2829Однако сторонние *циклы событий* могут *повторно использовать* встроенные реализации future и задач, чтобы бесплатно получить сложный и высокооптимизированный код.3031Для этой цели перечислены следующие *закрытые* конструкторы:3233#### `Future.__init__(*, loop=None)`3435Создаёт встроенный экземпляр future.3637*loop* – необязательный экземпляр цикла событий.3839#### `Task.__init__(coro, *, loop=None, name=None, context=None)`4041Создаёт встроенный экземпляр task.4243*loop* – необязательный экземпляр цикла событий. Остальные аргументы описаны в описании [`loop.create_task()`](https://python-all.ru/3.11/library/asyncio-eventloop.html#asyncio.loop.create_task).4445Изменено в версии 3.11: добавлен аргумент *context*.4647## Поддержка времени жизни задачи4849Реализация задачи от стороннего разработчика должна вызывать следующие функции, чтобы задача оставалась видимой для [`asyncio.all_tasks()`](https://python-all.ru/3.11/library/asyncio-task.html#asyncio.all_tasks) и [`asyncio.current_task()`](https://python-all.ru/3.11/library/asyncio-task.html#asyncio.current_task):5051#### `asyncio._register_task(task)`5253Регистрирует новую *задачу* как управляемую *asyncio*.5455Вызывайте эту функцию из конструктора задачи.5657#### `asyncio._unregister_task(task)`5859Удаляет *задачу* из внутренних структур *asyncio*.6061Функцию следует вызывать, когда задача вот-вот завершится.6263#### `asyncio._enter_task(loop, task)`6465Переключает текущую задачу на аргумент *task*.6667Функция вызывается непосредственно перед выполнением части встроенной *корутины* ([`coroutine.send()`](https://python-all.ru/3.11/reference/datamodel.html#coroutine.send) или [`coroutine.throw()`](https://python-all.ru/3.11/reference/datamodel.html#coroutine.throw)).6869#### `asyncio._leave_task(loop, task)`7071Переключить текущую задачу обратно с *задачи* на `None`.7273Функция вызывается сразу после выполнения [`coroutine.send()`](https://python-all.ru/3.11/reference/datamodel.html#coroutine.send) или [`coroutine.throw()`](https://python-all.ru/3.11/reference/datamodel.html#coroutine.throw) .74