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
560
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
1k
Rhapsody in Zero Knowledge - Proving without Revealing
tarcieri
2
290
Rust in Blockchain - Tendermint KMS and Abscissa
tarcieri
0
570
Insane in the Blockchain
tarcieri
1
700
Macaroons for Rust
tarcieri
3
800
A Protocol for Interledger Payments
tarcieri
0
380
Frontiers in Cryptography
tarcieri
2
1.6k
Macaroons - A Better Kind of Cookie
tarcieri
1
310
Thoughts on Rust Cryptography
tarcieri
6
6.8k
Other Decks in Programming
See All in Programming
『GO』アプリ バックエンドサーバのコスト削減
mot_techtalk
0
150
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
Unity Android XR入門
sakutama_11
0
160
『品質』という言葉が嫌いな理由
korimu
0
160
Amazon ECS とマイクロサービスから考えるシステム構成
hiyanger
2
570
Honoのおもしろいミドルウェアをみてみよう
yusukebe
1
210
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
740
富山発の個人開発サービスで日本中の学校の業務を改善した話
krpk1900
5
390
Linux && Docker 研修/Linux && Docker training
forrep
24
4.5k
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
push_gawa
0
210
color-scheme: light dark; を完全に理解する
uhyo
5
390
Bedrock Agentsレスポンス解析によるAgentのOps
licux
3
850
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
133
9.1k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Designing for humans not robots
tammielis
250
25k
Docker and Python
trallard
44
3.3k
Documentation Writing (for coders)
carmenintech
67
4.6k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
330
Git: the NoSQL Database
bkeepers
PRO
427
64k
Automating Front-end Workflow
addyosmani
1368
200k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Agile that works and the tools we love
rasmusluckow
328
21k
Music & Morning Musume
bryan
46
6.3k
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