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
300
Rust in Blockchain - Tendermint KMS and Abscissa
tarcieri
0
590
Insane in the Blockchain
tarcieri
1
710
Macaroons for Rust
tarcieri
3
810
A Protocol for Interledger Payments
tarcieri
0
400
Frontiers in Cryptography
tarcieri
2
1.6k
Macaroons - A Better Kind of Cookie
tarcieri
1
330
Thoughts on Rust Cryptography
tarcieri
6
6.9k
Other Decks in Programming
See All in Programming
C++20 射影変換
faithandbrave
0
440
カクヨムAndroidアプリのリブート
numeroanddev
0
410
RubyKaigiで得られる10の価値 〜Ruby話を聞くことだけが RubyKaigiじゃない〜
tomohiko9090
0
140
人には人それぞれのサービス層がある
shimabox
3
670
Effect の双対、Coeffect
yukikurage
5
1.4k
Webからモバイルへ Vue.js × Capacitor 活用事例
naokihaba
0
550
型付きアクターモデルがもたらす分散シミュレーションの未来
piyo7
0
770
Javaに鉄道指向プログラミング (Railway Oriented Pro gramming) のエッセンスを取り入れる/Bringing the Essence of Railway-Oriented Programming to Java
cocet33000
2
540
Prism.parseで 300本以上あるエンドポイントに 接続できる権限の一覧表を作ってみた
hatsu38
1
110
既存デザインを変更せずにタップ領域を広げる方法
tahia910
1
200
無関心の谷
kanayannet
0
160
セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用
kazumura
1
170
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Facilitating Awesome Meetings
lara
54
6.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
The Straight Up "How To Draw Better" Workshop
denniskardys
233
140k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.3k
The Language of Interfaces
destraynor
158
25k
Balancing Empowerment & Direction
lara
1
290
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
GraphQLとの向き合い方2022年版
quramy
46
14k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
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