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
A Crash Course on Celluloid (GoGaRuCo 2012)
Search
tarcieri
September 15, 2012
Programming
6
580
A Crash Course on Celluloid (GoGaRuCo 2012)
A quick introduction to the basic features of Celluloid
tarcieri
September 15, 2012
Tweet
Share
More Decks by tarcieri
See All by tarcieri
Embedded cryptography in Rust: RustCrypto + Veriform
tarcieri
0
1.2k
Rhapsody in Zero Knowledge - Proving without Revealing
tarcieri
2
320
Rust in Blockchain - Tendermint KMS and Abscissa
tarcieri
0
640
Insane in the Blockchain
tarcieri
1
730
Macaroons for Rust
tarcieri
3
830
A Protocol for Interledger Payments
tarcieri
0
430
Frontiers in Cryptography
tarcieri
2
1.7k
Macaroons - A Better Kind of Cookie
tarcieri
1
370
Thoughts on Rust Cryptography
tarcieri
6
7.2k
Other Decks in Programming
See All in Programming
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
160
CSC307 Lecture 06
javiergs
PRO
0
700
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
PRO
0
150
CSC307 Lecture 11
javiergs
PRO
0
580
Data-Centric Kaggle
isax1015
2
810
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
300
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
7
1k
ぼくの開発環境2026
yuzneri
1
270
iOSアプリでフロントエンドと仲良くする
ryunakayama
0
110
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
810
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
150
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
170
Featured
See All Featured
Building the Perfect Custom Keyboard
takai
2
690
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
180
Marketing to machines
jonoalderson
1
4.9k
Evolving SEO for Evolving Search Engines
ryanjones
0
130
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
420
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
77
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
82
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.1k
Writing Fast Ruby
sferik
630
62k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
120
Transcript
A Crash Course on Tony Arcieri GoGaRuCo September 15th, 2012
Saturday, September 15, 12
Saturday, September 15, 12
We’re hiring! Saturday, September 15, 12
“Threads on Rails!” Saturday, September 15, 12
Sidekiq What if 1 Sidekiq process could do the work
of 20 Resque processes? http://mperham.github.com/sidekiq/ Saturday, September 15, 12
OOP + Actor Model Saturday, September 15, 12
“I thought of objects being like biological cells and/or individual
computers on a network, only able to communicate with messages” - Alan Kay, creator of Smalltalk, on the meaning of "object oriented programming" Saturday, September 15, 12
Active Objects Based on the Actor Model Saturday, September 15,
12
Saturday, September 15, 12
Saturday, September 15, 12
Actor Model •Actors are computational entities that can receive messages
•Each actor has a unique address •If you know an actor’s address, you can send it messages •Actors can create new actors Saturday, September 15, 12
I’m not the first to do Actor Model + OOP
Saturday, September 15, 12
Saturday, September 15, 12
Forgotten approach to concurrency? Saturday, September 15, 12
Example Saturday, September 15, 12
require 'celluloid' class Launcher include Celluloid def launch 3.downto(1) do
|count| puts "#{count}..." sleep 1 end puts "BLASTOFF!" end end Saturday, September 15, 12
require 'celluloid' class Launcher include Celluloid def launch 3.downto(1) do
|count| puts "#{count}..." sleep 1 end puts "BLASTOFF!" end end Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> Saturday, September 15, 12
Synchronous Calls Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch Saturday, September
15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch 3... Saturday,
September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch 3... 2...
Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch 3... 2...
1... Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch 3... 2...
1... BLASTOFF! => nil >> Saturday, September 15, 12
&DOOHU &HOOXORLG $FWRU3UR[\ &$// 5HFHLYHU &HOOXORLG 0DLOER[ 5(63216( &HOOXORLG 0DLOER[
&HOOXORLG$FWRU &HOOXORLG&DOO &HOOXORLG5HVSRQVH Synchronous Calls Saturday, September 15, 12
Asynchronous Calls Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch Saturday, September
15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch New syntax!
Saturday, September 15, 12
THEY TOOK ‘ER BANG METHERDS!!!!! Saturday, September 15, 12
You’ll get them back in Celluloid 1.0 Saturday, September 15,
12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch Saturday, September
15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil
>> Returns immediately Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil
>> 3... Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil
>> 3... 2... Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil
>> 3... 2... 1... Saturday, September 15, 12
>> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil
>> 3... 2... 1... BLASTOFF! Saturday, September 15, 12
Asynchronous Calls &DOOHU &HOOXORLG $V\QF3UR[\ &$// 5HFHLYHU &HOOXORLG 0DLOER[ &HOOXORLG$FWRU
&HOOXORLG&DOO Saturday, September 15, 12
Futures Saturday, September 15, 12
class FibonacciWorker include Celluloid def fib(n) n < 2 ?
n : fib(n-1) + fib(n-2) end end Saturday, September 15, 12
>> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)
=> #<Celluloid::Future:0x007ffb9201f0a0> Saturday, September 15, 12
>> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)
=> #<Celluloid::Future:0x007ffb9201f0a0> Returns immediately Saturday, September 15, 12
>> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)
=> #<Celluloid::Future:0x007ffb9201f0a0> >> future.value Saturday, September 15, 12
>> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)
=> #<Celluloid::Future:0x007ffb9201f0a0> >> future.value Blocks until complete Saturday, September 15, 12
>> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)
=> #<Celluloid::Future:0x007ffb9201f0a0> >> future.value => 102334155 Saturday, September 15, 12
&DOOHU &HOOXORLG $FWRU3UR[\ 5HFHLYHU &HOOXORLG 0DLOER[ &HOOXORLG$FWRU &HOOXORLG&DOO &$// &HOOXORLG
0DLOER[ )8785( &HOOXORLG )XWXUH &HOOXORLG5HVSRQVH 9$/8(" 9$/8( Futures Saturday, September 15, 12
Pools Saturday, September 15, 12
>> pool = FibonacciWorker.pool(size: 16) => #<Celluloid::Pool(FibonacciWorker:0x3ffdcaed65cc)> Saturday, September 15,
12
>> pool = FibonacciWorker.pool => #<Celluloid::Pool(FibonacciWorker:0x3ffdcaed65cc)> 1 actor per CPU
(by default) Saturday, September 15, 12
>> pool = FibonacciWorker.pool => #<Celluloid::Pool(FibonacciWorker:0x3ffdcaed65cc)> >> (32...40).map { |n|
pool.future.fib(n) }.map(&:value) Saturday, September 15, 12
>> pool = FibonacciWorker.pool => #<Celluloid::Pool(FibonacciWorker:0x3ffdcaed65cc)> >> (32...40).map { |n|
pool.future.fib(n) }.map(&:value) => [2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986] Saturday, September 15, 12
Beware the GIL •YARV can do parallel I/O in threads
•...but NOT parallel computation (e.g. fib) •JRuby and Rubinius will light up all your cores :) Saturday, September 15, 12
Twitter: @bascule @celluloidrb Celluloid: celluloid.io Blog: unlimitednovelty.com Saturday, September 15,
12