Slide 1

Slide 1 text

A Crash Course on Tony Arcieri GoGaRuCo September 15th, 2012 Saturday, September 15, 12

Slide 2

Slide 2 text

Saturday, September 15, 12

Slide 3

Slide 3 text

We’re hiring! Saturday, September 15, 12

Slide 4

Slide 4 text

“Threads on Rails!” Saturday, September 15, 12

Slide 5

Slide 5 text

Sidekiq What if 1 Sidekiq process could do the work of 20 Resque processes? http://mperham.github.com/sidekiq/ Saturday, September 15, 12

Slide 6

Slide 6 text

OOP + Actor Model Saturday, September 15, 12

Slide 7

Slide 7 text

“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

Slide 8

Slide 8 text

Active Objects Based on the Actor Model Saturday, September 15, 12

Slide 9

Slide 9 text

Saturday, September 15, 12

Slide 10

Slide 10 text

Saturday, September 15, 12

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

I’m not the first to do Actor Model + OOP Saturday, September 15, 12

Slide 13

Slide 13 text

Saturday, September 15, 12

Slide 14

Slide 14 text

Forgotten approach to concurrency? Saturday, September 15, 12

Slide 15

Slide 15 text

Example Saturday, September 15, 12

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

>> launcher = Launcher.new => # Saturday, September 15, 12

Slide 19

Slide 19 text

Synchronous Calls Saturday, September 15, 12

Slide 20

Slide 20 text

>> launcher = Launcher.new => # >> launcher.launch Saturday, September 15, 12

Slide 21

Slide 21 text

>> launcher = Launcher.new => # >> launcher.launch 3... Saturday, September 15, 12

Slide 22

Slide 22 text

>> launcher = Launcher.new => # >> launcher.launch 3... 2... Saturday, September 15, 12

Slide 23

Slide 23 text

>> launcher = Launcher.new => # >> launcher.launch 3... 2... 1... Saturday, September 15, 12

Slide 24

Slide 24 text

>> launcher = Launcher.new => # >> launcher.launch 3... 2... 1... BLASTOFF! => nil >> Saturday, September 15, 12

Slide 25

Slide 25 text

&DOOHU &HOOXORLG $FWRU3UR[\ &$// 5HFHLYHU &HOOXORLG 0DLOER[ 5(63216( &HOOXORLG 0DLOER[ &HOOXORLG$FWRU &HOOXORLG&DOO &HOOXORLG5HVSRQVH Synchronous Calls Saturday, September 15, 12

Slide 26

Slide 26 text

Asynchronous Calls Saturday, September 15, 12

Slide 27

Slide 27 text

>> launcher = Launcher.new => # >> launcher.async.launch Saturday, September 15, 12

Slide 28

Slide 28 text

>> launcher = Launcher.new => # >> launcher.async.launch New syntax! Saturday, September 15, 12

Slide 29

Slide 29 text

THEY TOOK ‘ER BANG METHERDS!!!!! Saturday, September 15, 12

Slide 30

Slide 30 text

You’ll get them back in Celluloid 1.0 Saturday, September 15, 12

Slide 31

Slide 31 text

>> launcher = Launcher.new => # >> launcher.async.launch Saturday, September 15, 12

Slide 32

Slide 32 text

>> launcher = Launcher.new => # >> launcher.async.launch => nil >> Returns immediately Saturday, September 15, 12

Slide 33

Slide 33 text

>> launcher = Launcher.new => # >> launcher.async.launch => nil >> 3... Saturday, September 15, 12

Slide 34

Slide 34 text

>> launcher = Launcher.new => # >> launcher.async.launch => nil >> 3... 2... Saturday, September 15, 12

Slide 35

Slide 35 text

>> launcher = Launcher.new => # >> launcher.async.launch => nil >> 3... 2... 1... Saturday, September 15, 12

Slide 36

Slide 36 text

>> launcher = Launcher.new => # >> launcher.async.launch => nil >> 3... 2... 1... BLASTOFF! Saturday, September 15, 12

Slide 37

Slide 37 text

Asynchronous Calls &DOOHU &HOOXORLG $V\QF3UR[\ &$// 5HFHLYHU &HOOXORLG 0DLOER[ &HOOXORLG$FWRU &HOOXORLG&DOO Saturday, September 15, 12

Slide 38

Slide 38 text

Futures Saturday, September 15, 12

Slide 39

Slide 39 text

class FibonacciWorker include Celluloid def fib(n) n < 2 ? n : fib(n-1) + fib(n-2) end end Saturday, September 15, 12

Slide 40

Slide 40 text

>> worker = FibonacciWorker.new => # >> future = worker.future.fib(40) => # Saturday, September 15, 12

Slide 41

Slide 41 text

>> worker = FibonacciWorker.new => # >> future = worker.future.fib(40) => # Returns immediately Saturday, September 15, 12

Slide 42

Slide 42 text

>> worker = FibonacciWorker.new => # >> future = worker.future.fib(40) => # >> future.value Saturday, September 15, 12

Slide 43

Slide 43 text

>> worker = FibonacciWorker.new => # >> future = worker.future.fib(40) => # >> future.value Blocks until complete Saturday, September 15, 12

Slide 44

Slide 44 text

>> worker = FibonacciWorker.new => # >> future = worker.future.fib(40) => # >> future.value => 102334155 Saturday, September 15, 12

Slide 45

Slide 45 text

&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

Slide 46

Slide 46 text

Pools Saturday, September 15, 12

Slide 47

Slide 47 text

>> pool = FibonacciWorker.pool(size: 16) => # Saturday, September 15, 12

Slide 48

Slide 48 text

>> pool = FibonacciWorker.pool => # 1 actor per CPU (by default) Saturday, September 15, 12

Slide 49

Slide 49 text

>> pool = FibonacciWorker.pool => # >> (32...40).map { |n| pool.future.fib(n) }.map(&:value) Saturday, September 15, 12

Slide 50

Slide 50 text

>> pool = FibonacciWorker.pool => # >> (32...40).map { |n| pool.future.fib(n) }.map(&:value) => [2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986] Saturday, September 15, 12

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

Twitter: @bascule @celluloidrb Celluloid: celluloid.io Blog: unlimitednovelty.com Saturday, September 15, 12