tutorial run programming make how has español attribute asyncio async python async-await generator python-asyncio coroutine

python - run - ¿Qué hace la sintaxis de "rendimiento desde" en asyncio y en qué se diferencia de "esperar"?



python async api (1)

Desde la perspectiva de alguien que ha escrito un código asyncio, pero está buscando entender mejor el funcionamiento interno, qué es lo que se yield from , lo que está await y cómo son útiles para permitir el código asíncrono.

Hay una pregunta altamente actualizada que pregunta sobre los usos del yield from sintaxis y otra que explica async y espera , pero ambas profundizan sobre diferentes temas y no son realmente una explicación concisa del código subyacente y cómo encaja con asyncio.


Respuesta corta:

yield from es una vieja forma de esperar a la coroutina de asyncio.

await es una forma moderna de esperar la coroutina de asyncio.

Respuesta detallada:

Python tiene generadores: un tipo especial de funciones que produce una secuencia de resultados en lugar de un solo valor. Comenzando con Python 3.3 se agregó el yield from expresión. allows un generador delegue parte de sus operaciones a otro generador.

A partir de Python 3.4 se asyncio módulo asyncio a la biblioteca estándar. Nos permite escribir código asíncrono claro y comprensible. Si bien técnicamente las coroutinas de asyncio se podían implementar de diferentes maneras, en asyncio se implementaron usando generadores (se puede ver un excelente video donde se muestra cómo se pueden usar los generadores para implementar coroutines). @asyncio.coroutine era una forma de hacer coroutine a partir del generador y el yield from era una forma de esperar a coroutine, solo detalles de la implementación.

Así es como sucedió que el yield from comenzó a utilizarse para dos "cosas diferentes".

A partir de Python 3.5 (ver recent ), las rutinas obtuvieron una nueva sintaxis. Ahora puede definir coroutine con async def y esperar a usar la expresión de await . No solo es más corto para escribir, sino que también lo hace más claro para entender que trabajamos con las rutinas de Asyncio.

Si está usando Python 3.5+, puede olvidarse de usar el yield from rutinas de asyncio y usarlo para await .