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
Greenlet-based concurrency
Search
Goran Peretin
July 03, 2013
Programming
700
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Greenlet-based concurrency
Slides from EuroPython 2013 talk Greenlet-based concurrency.
Goran Peretin
July 03, 2013
Transcript
50 slides
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/
More Decks by Goran Peretin
See All by Goran Peretin
Webcamp Zagreb 2013
gperetin
1
340
On Concurrency
gperetin
1
430
WebcampZG 2012
gperetin
1
450
Other Decks in Programming
See All in Programming
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
150
[DroidKnights 2026] Workflow AX: From Auto-Documented Policies to E2E Testing
raeminkang
0
570
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
210
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
150
どうしても Eloquent でリポジトリパターンをやりたいんだ #phpcon_niigata / phpcon-niigata-2026
shogogg
0
300
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
680
Kawaiicon: Kubernetes, it's no longer cool, but let's secure it anyway!
barnbarn
0
130
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
350
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
350
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
1
330
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
340
AI Augmentation Techniques with Liberty
ivargrimstad
1
480
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
660
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.2k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
4
1.3k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
The browser strikes back
jonoalderson
0
1.9k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.4k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
690
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
Context Engineering - Making Every Token Count
addyosmani
9
1.3k
GitHub's CSS Performance
jonrohan
1033
470k