Что делает синтаксис "yield from" в asyncio и чем он отличается от "await"
С точки зрения того, кто написал асинхронный код, но хочет лучше понять внутреннюю работу, что такое yield from
, await
и как они полезны для разрешения асинхронного кода?
Существует один вопрос, который ставит вопрос об использовании yield from
синтаксис и один, объясняющий асинхронность и ожидание, но оба углубляются в разные темы и на самом деле не являются кратким объяснением основного кода и того, как он вписывается в asyncio.
1 ответ
Короткий ответ:
yield from
старый способ ждать сопрограмму Асинсио.
await
это современный способ ожидания сопрограммы Асинсио.
Подробный ответ:
В Python есть генераторы - особый вид функций, который выдает последовательность результатов вместо одного значения. Начиная с Python 3.3 yield from
Выражение было добавлено. Это позволяет одному генератору делегировать часть своих операций другому генератору.
Начиная с Python 3.4 asyncio
модуль был добавлен в стандартную библиотеку. Это позволяет нам писать ясный и понятный асинхронный код. Хотя технически сопрограммы Asyncio могут быть реализованы по-разному, в asyncio
они были реализованы с использованием генераторов (вы можете посмотреть отличное видео, где показано, как генераторы могут использоваться для реализации сопрограмм). @asyncio.coroutine
был способ сделать сопрограмму из генератора и yield from
был способ ждать сопрограммы - только детали реализации.
Вот так получилось yield from
начал использоваться для двух "разных вещей".
Начиная с Python 3.5 (см. PEP 492) сопрограммы получили новый синтаксис. Теперь вы можете определить сопрограмму с async def
и ждать его с помощью await
выражение. Это не только короче, чтобы написать, но также и яснее понять, что мы работаем с сопрограммами asyncio.
Если вы используете Python 3.5+, вы можете забыть об использовании yield from
для сопрограмм и использования Asyncio await
для этого.