Что делает синтаксис "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 для этого.

Другие вопросы по тегам