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
Greenlet-based concurrency
Search
Goran Peretin
July 03, 2013
Programming
2
550
Greenlet-based concurrency
Slides from EuroPython 2013 talk Greenlet-based concurrency.
Goran Peretin
July 03, 2013
Tweet
Share
More Decks by Goran Peretin
See All by Goran Peretin
Webcamp Zagreb 2013
gperetin
1
210
On Concurrency
gperetin
1
300
WebcampZG 2012
gperetin
1
380
Other Decks in Programming
See All in Programming
The Cutting Edge Of Versioning (LambdaConf 2024)
chriskrycho
0
250
TypeScriptのパフォーマンス改善
yajihum
14
5k
Open standards for building event-driven applications in the cloud
meteatamel
0
230
Findy - エンジニア向け会社紹介 / Findy Letter for Engineers
findyinc
2
74k
Namespace, What and Why
tagomoris
3
670
『WordPressコミュニティで学ぶ』OSS貢献の多様性
ippey
0
230
Open AI APIを使う前に知っておきたいアカウントTier の話
akki_megane
0
130
JavaScript Closure
asoluka
0
2k
RailsConf 2024: Riffing on Rails: sketch your way to better designed code
kaspth
1
220
Fragment Composition of GraphQL
quramy
14
1.7k
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
240
Ruby on Fails - effective error handling with Rails conventions
talyssonoc
0
300
Featured
See All Featured
Pencils Down: Stop Designing & Start Developing
hursman
117
11k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
67
14k
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
Fireside Chat
paigeccino
22
2.7k
The Pragmatic Product Professional
lauravandoore
26
5.9k
Product Roadmaps are Hard
iamctodd
45
9.8k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
12
1.1k
Web Components: a chance to create the future
zenorocha
306
41k
5 minutes of I Can Smell Your CMS
philhawksworth
199
19k
Automating Front-end Workflow
addyosmani
1357
200k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
21
2k
Transcript
Greenlet-based concurrency Goran Peretin @gperetin
Who am I? ✤ Freelancer ✤ Interested in concurrent, parallel
and distributed systems
What is this about? ✤ understand what <buzzword> is ✤
when should you use <buzzword> ✤ concurrency as execution model (as opposed to composition model)
There will be no... ✤ Turnkey solutions ✤ GIL ✤
Details
Buzzwords ahead!
✤ concurrent vs parallel execution ✤ cooperative vs preemptive multitasking
✤ CPU bound vs IO bound task ✤ thread-based vs event-based concurrency
Mandatory definitions
Parallel execution ✤ Simultaneous execution of multiple tasks ✤ Must
have multiple CPUs
Concurrent execution ✤ Executing multiple tasks in the same time
frame ✤ ... but not necessarily at the same time ✤ Doesn’t require multiple CPU cores
Why do we want concurrent execution? ✤ We need it
- more tasks than CPUs ✤ CPU is much faster than anything else
Thread-based concurrecy ✤ Executing multiple threads in the same time
frame ✤ OS scheduler decides which thread runs when
How OS scheduler switches tasks? ✤ When current thread does
IO operation ✤ When current thread used up it’s time slice
How OS scheduler switches tasks? ✤ When current thread does
IO operation ✤ When current thread used up it’s time slice Preemptive multitasking
None
Mandatory GIL slide ✤ Global Interpreter Lock ✤ One Python
interpreter can run just one thread at any point in time ✤ Only problem for CPU bound tasks
CPU bound vs IO bound ✤ CPU bound - time
to complete a task is determined by CPU speed ✤ calculating Fibonacci sequence, video processing... ✤ IO bound - does a lot of IO, eg. reading from disk, network requests... ✤ URL crawler, most web applications...
Python anyone? ✤ import threading ✤ Python threads - real
OS threads
Houston, we have a...
Problem? ✤ Lots of threads ✤ Thousands
Benchmarks!
Sample programs ✤ Prog 1: spawn some number of threads
- each sleeps 200ms ✤ Prog 2: spawn some number of threads - each sleeps 90s
Prog 1 ✤ Sleep 200ms # of threads 100 1K
10K 100K Time 207 ms 327 ms 2.55 s 25.42 s
Prog 2 ✤ Sleep 90s # of threads 100 1K
10K 100K RAM ~4.9 GB ~11.8 GB ~82GB ? (256GB)
... and more ✤ Number of threads is limited ✤
Preemptive multitasking
We need ✤ Fast to create ✤ Low memory footprint
✤ We decide when to switch
Green threads!
Green threads ✤ Not managed by OS ✤ 1:N with
OS threads ✤ User threads, light-weight processes
Greenlets ✤ “...more primitive notion of micro- thread with no
implicit scheduling; coroutines, in other words.” ✤ C extension
Greenlets ✤ Micro-thread ✤ No implicit scheduling ✤ Coroutines
Coroutine ✤ Function that can suspend it’s execution and then
later resume ✤ Can also be implemented in pure Python (PEP 342) ✤ Coroutines decide when they want to switch
Coroutine ✤ Function that can suspend it’s execution and then
later resume ✤ Can also be implemented in pure Python (PEP 342) ✤ Coroutines decide when they want to switch Cooperative multitasking
Cooperative multitasking ✤ Each task decides when to give others
a chance to run ✤ Ideal for I/O bound tasks ✤ Not so good for CPU bound tasks
Using greenlets ✤ We need something that will know which
greenlet should run next ✤ Our calls must not block ✤ We need something to notify us when our call is done
Using greenlets ✤ We need something that will know which
greenlet should run next ✤ Our calls must not block ✤ We need something to notify us when our call is done Scheduler
Using greenlets ✤ We need something that will know which
greenlet should run next ✤ Our calls must not block ✤ We need something to notify us when our call is done Scheduler Event loop
Event loop ✤ Listens for events from OS and notifies
your app ✤ Asynchronous
None
✤ Scheduler ✤ Event loop Greenlets + ...
Gevent
Gevent ✤ “...coroutine-based Python networking library that uses greenlet to
provide a high-level synchronous API on top of the libevent event loop.”
None
Prog 1 ✤ Sleep 200ms # of threads 100 1K
10K 100K Time 207 ms 327 ms 2.55 s 25.42 s # of Greenlets 100 1K 10K 100K Time 204 ms 223 ms 421 ms 3.06 s
Prog 2 ✤ Sleep 90s # of threads 100 1K
10K 100K RAM 4.9 GB 11.8 GB 82GB ? (256GB) # of Greenlets 100 1K 10K 100K Time 33 MB 41 MB 114 MB 858 MB
Gevent ✤ Monkey-patching ✤ Event loop
Disadvantages ✤ Monkey-patching ✤ Doesn’t work with C extensions ✤
Greenlet implementation details ✤ Hard to debug
Alternatives ✤ Twisted ✤ Tornado ✤ Callback based
PEP 3156 & Tulip ✤ Attempt to standardize event loop
API in Python ✤ Tulip is an implementation
Recap ✤ Concurrent execution helps with IO bound applications ✤
Use threads if it works for you ✤ Use async library if you have lots of connections
Thank you! ✤ Questions?
Resources ✤ http:/ /dabeaz.com/coroutines/Coroutines.pdf ✤ http:/ /www.gevent.org/ ✤ http:/ /greenlet.readthedocs.org/en/latest/