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
640
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
310
On Concurrency
gperetin
1
380
WebcampZG 2012
gperetin
1
420
Other Decks in Programming
See All in Programming
Web Components で実現する Hotwire とフロントエンドフレームワークの橋渡し / Bridging with Web Components
da1chi
3
1.5k
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
0
350
気づいて!アプリからのSOS 〜App Store Connect APIで始めるパフォーマンス健康診断〜
waka12
0
260
高度なUI/UXこそHotwireで作ろう Kaigi on Rails 2025
naofumi
4
3.1k
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
310
iOS 17で追加されたSubscriptionStoreView を利用して5分でサブスク実装チャレンジ
natmark
0
480
Back to the Future: Let me tell you about the ACP protocol
terhechte
0
120
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
170
Playwrightはどのようにクロスブラウザをサポートしているのか
yotahada3
7
2.2k
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
150
ててべんす独演会〜Flowの全てを語ります〜
tbsten
1
220
After go func(): Goroutines Through a Beginner’s Eye
97vaibhav
0
220
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
BBQ
matthewcrist
89
9.8k
Typedesign – Prime Four
hannesfritz
42
2.8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Gamification - CAS2011
davidbonilla
81
5.5k
Docker and Python
trallard
46
3.6k
Building Applications with DynamoDB
mza
96
6.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
2.6k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6.1k
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/