Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
How async and await ended up in Python
Search
Pavlin Gergov
July 27, 2018
0
260
How async and await ended up in Python
EuroPython 2018, Edinbugh
Pavlin Gergov
July 27, 2018
Tweet
Share
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1370
200k
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.7k
GitHub's CSS Performance
jonrohan
1031
460k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
Typedesign – Prime Four
hannesfritz
41
2.6k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
The Language of Interfaces
destraynor
158
25k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.5k
The Cult of Friendly URLs
andyhume
78
6.4k
Transcript
How async and await ended up in Python EuroPython 2018,
Edinburgh
Hello (: https:/ /www.hacksoft.io Django React Twitter: @pgergov_
None
Python is synchronous
Request Response
None
None
Threads
Asynchronous
asyncio
hello_asyncio.py import asyncio async def hello_world_coroutine(delay): print('Hello') await asyncio.sleep(delay) print(f'World,
with delay: {delay}') loop = asyncio.get_event_loop() loop.create_task(hello_world_coroutine(1)) loop.create_task(hello_world_coroutine(2)) loop.run_forever()
Python 3.6.3 Hell Hello World, with delay 1 World, with
delay 2
hello_asyncio.py import asyncio async def hello_world_coroutine(delay): print('Hello') await asyncio.sleep(delay) print(f'World,
with delay: {delay}') loop = asyncio.get_event_loop() loop.create_task(hello_world_coroutine(1)) loop.create_task(hello_world_coroutine(2)) loop.run_forever()
Coroutines are computer-program components that generalize subroutines for non-preemptive multitasking,
by allowing multiple entry points for suspending and resuming execution at certain locations Wikipedia
None
None
How async and await ended up in python Order of
execution - raise and return Iterable and Iterator Generator functions - yield and .send Python 3.3 yield from Definition for coroutine in Python Python 3.4, @asyncio.coroutine Python 3.5, @types.coroutine async and await
Order of execution
throw_exception.py def throw_exception(): print('Will raise an Exception') raise Exception('Raised inside
`throw_exception`') print('This message won\'t be printed')
hello_world.py def hello_world(): print('Hello world!') return 42 print('This message will
never be printed')
yield
Iterable __iter__ for x in iterable:
Iterator __next__ __iter__
class MyIterator: def __init__(self): self.counter = 1 def __iter__(self): return
self def __next__(self): counter = self.counter if counter > 3: raise StopIteration self.counter += 1 return counter iterator.py
iterator = MyIterator() next(iterator) # returns 1 next(iterator) # returns
2 next(iterator) # returns 3 next(iterator) # raises StopIteration
iterator = MyIterator() for numb in iterator: print(numb) 1 2
3
Generator function
def generator_function(): print('Going to yield first value') yield 1 print('Yielding
second value') yield 2 generator_function.py
gen = generator_function() next(gen) ‘Going to yield first value’ 1
next(gen) ‘Yielding second value’ 2 next(gen) # raises StopIteration
.send
def generator_send(): print('Going to yield a value') received = yield
42 print(f'Received {received}') generator_send.py
gen = generator_function() gen.send(None) ‘Going to yield value’ 42 gen.send(‘Hello
generator’) ‘Received Hello generator’ StopIteration is raised
yield from for x in iterator: yield x yield from
iterator Python 3.3
def first_generator(): yield 1 print('In the middle of first generator')
yield 2 def second_generator(): gen = first_generator() yield from gen print('In the middle of second generator') yield 3 yield_from.py
gen = second_generator() next(gen) 1 next(gen) In the middle of
first generator 2 next(gen) In the middle of second generator 3 next(gen) # raises StopIteration
Coroutines are computer-program components that generalize subroutines for non-preemptive multitasking,
by allowing multiple entry points for suspending and resuming execution at certain locations Wikipedia
definition of coroutine in Python Python 3.3
@asyncio.coroutine Python 3.4
Python 3.6.3 import asyncio async def hello_world_coroutine(delay): print('Hello') await asyncio.sleep(delay)
print(f'World, with delay: {delay}') loop = asyncio.get_event_loop() loop.create_task(hello_world_coroutine(1)) loop.create_task(hello_world_coroutine(2)) loop.run_forever()
Python 3.4 import asyncio @asyncio.coroutine def hello_world_coroutine(delay): print('Hello') yield from
asyncio.sleep(delay) print(f'World, with delay: {delay}') loop = asyncio.get_event_loop() loop.create_task(hello_world_coroutine(1)) loop.create_task(hello_world_coroutine(2)) loop.run_forever()
@types.coroutine Python 3.5
async Python 3.5 async def
await Python 3.5
__await__
Conclusion
What’s next?
The superpowers of async and await
Thank you Here’s a kiss for you! https:/ /github.com/pgergov/europython-2018