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
550
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
980
Rhapsody in Zero Knowledge - Proving without Revealing
tarcieri
2
290
Rust in Blockchain - Tendermint KMS and Abscissa
tarcieri
0
560
Insane in the Blockchain
tarcieri
1
700
Macaroons for Rust
tarcieri
3
790
A Protocol for Interledger Payments
tarcieri
0
380
Frontiers in Cryptography
tarcieri
2
1.6k
Macaroons - A Better Kind of Cookie
tarcieri
1
290
Thoughts on Rust Cryptography
tarcieri
6
6.7k
Other Decks in Programming
See All in Programming
103 Early Hints
sugi_0000
1
230
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
720
testcontainers のススメ
sgash708
1
120
プロダクトの品質に コミットする / Commit to Product Quality
pekepek
2
770
nekko cloudにおけるProxmox VE利用事例
irumaru
3
430
SymfonyCon Vienna 2025: Twig, still relevant in 2025?
fabpot
3
1.2k
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
180
テストコードのガイドライン 〜作成から運用まで〜
riku929hr
1
170
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
Symfony Mapper Component
soyuka
2
730
Haze - Real time background blurring
chrisbanes
1
510
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
4
1.1k
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
A designer walks into a library…
pauljervisheath
204
24k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
What's in a price? How to price your products and services
michaelherold
243
12k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
RailsConf 2023
tenderlove
29
940
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
The Cult of Friendly URLs
andyhume
78
6.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
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