Русский
Открыть в Telegram

Пост Когда корутина asyncio хочет остановиться и взаимодействовать с циклом событий (event loop), она использует await obj (и…

27 ноября 2025
Б
Библиотека Python разработчика | Книги по питону
Когда корутина asyncio хочет остановиться и взаимодействовать с циклом событий (event loop), она использует await obj (или yield from obj до Python 3.6). Объект obj должен быть другой корутиной, объектом asyncio.Future или любым пользовательским объектом, похожим на Future (любой объект, у которого определен метод __await__). async def coroutine(): await another_coroutine() async def another_coroutine(): future = asyncio.Future() await future loop = asyncio.get_event_loop() loop.run_until_complete(coroutine()) Когда корутина ожидает (await) другую корутину, вторая начинает выполняться вместо первой. Если она ожидает третью, то выполняется третья. Это продолжается до тех пор, пока какая-нибудь корутина не ожидает объект Future. Объект Future фактически возвращает значение, и тогда цикл событий (event loop) получает управление. Какое значение возвращает Future? Оно возвращает сам себя. Можете ли вы напрямую использовать yield для Future? Нет, это внутренняя деталь, о которой вам обычно не нужно беспокоиться. class Awaitable: def __await__(self): future = asyncio.Future() yield future # RuntimeError: yield was used # instead of yield from in task async def coroutine(): await Awaitable() loop = asyncio.get_event_loop() loop.run_until_complete(coroutine()) Почему возникает эта ошибка? Как asyncio понимает, что это вы используете yield для Future, а не сам Future? Есть простая защита: Future устанавливает внутренний флаг перед тем, как вернуть управление. 📲 Мы в MAX 👉@BookPython
3 · 3.1K ·

Рядом в ленте

ББиблиотека Python разработчика | Книги по питонуUTF-8 - это кодировка с переменной длиной. Один символ может быть закодирован с использованием одного, двух, трёх или четырёх байтов. Это означает, что нельзя нББиблиотека Python разработчика | Книги по питонуИногда вам нужно запустить блок кода с несколькими контекстными менеджерами. Например: with open('f') as f: with open('g') as g: with open('h') as h: pass Начин
это сообщение
ББиблиотека Python разработчика | Книги по питонуРассмотрим следующую иерархию классов: class GrandParent: pass class Parent1(GrandParent): pass class Parent2(GrandParent): pass class Child(Parent1, Parent2): ББиблиотека Python разработчика | Книги по питонуПрямой доступ к атрибутам объекта может быть не самой лучшей идеей. Если клиенты взаимодействуют с объектом через методы, вы всегда можете изменить способ обраб
ББиблиотека Python разработчика | Книги по питонуБиблиотека Python разработчика | Книги по питону@BookPython · канал · Технологии
17 943подписчиков725средний охват поста
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Границы индекса · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем