What does the "yield from" syntax do in asyncio and how is it different from "await"
Solution 1:
Short answer:
yield from
is an old way to wait for asyncio's coroutine.
await
is a modern way to wait for asyncio's coroutine.
Detailed answer:
Python has generators - special kind of functions that produces a sequence of results instead of a single value. Starting with Python 3.3 yield from
expression was added. It allows one generator to delegate part of its operations to another generator.
Starting with Python 3.4 asyncio
module was added to standard library. It allow us to write clear and understandable asynchronous code. While technically asyncio's coroutines could be implemented different ways, in asyncio
they were implemented using generators (you can watch for excellent video where shown how generators can be used to implement coroutines). @asyncio.coroutine
was a way to make coroutine from generator and yield from
was a way to await for coroutine - just details of implementation.
That's how happened that yield from
started to be used for two "different things".
Starting with Python 3.5 (see PEP 492) coroutines got new syntax. Now you can define coroutine with async def
and await for it using await
expression. It's not only shorter to write, but also makes clearer to understand that we work with asyncio's coroutines.
If you're using Python 3.5+ you can forget about using yield from
for asyncio's coroutines and use await
for it.