Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
How async and await ended up in Python
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Pavlin Gergov
July 27, 2018
330
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
How async and await ended up in Python
EuroPython 2018, Edinbugh
Pavlin Gergov
July 27, 2018
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Exploring anti-patterns in Rails
aemeredith
4
510
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Between Models and Reality
mayunak
4
470
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
470
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Crafting Experiences
bethany
1
350
The SEO Collaboration Effect
kristinabergwall1
1
570
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
Mind Mapping
helmedeiros
1
370
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