tg-me.com/BookPython/3481
Last Update:
Когда корутина 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
устанавливает внутренний флаг перед тем, как вернуть управление.👉@BookPython
BY Библиотека Python разработчика | Книги по питону
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/BookPython/3481