Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A Crash Course on Celluloid (GoGaRuCo 2012)

4131d2f57a0db2a2b4d9a62bd389fd44?s=47 tarcieri
September 15, 2012

A Crash Course on Celluloid (GoGaRuCo 2012)

A quick introduction to the basic features of Celluloid

4131d2f57a0db2a2b4d9a62bd389fd44?s=128

tarcieri

September 15, 2012
Tweet

Transcript

  1. A Crash Course on Tony Arcieri GoGaRuCo September 15th, 2012

    Saturday, September 15, 12
  2. Saturday, September 15, 12

  3. We’re hiring! Saturday, September 15, 12

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

  5. Sidekiq What if 1 Sidekiq process could do the work

    of 20 Resque processes? http://mperham.github.com/sidekiq/ Saturday, September 15, 12
  6. OOP + Actor Model Saturday, September 15, 12

  7. “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
  8. Active Objects Based on the Actor Model Saturday, September 15,

    12
  9. Saturday, September 15, 12

  10. Saturday, September 15, 12

  11. 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
  12. I’m not the first to do Actor Model + OOP

    Saturday, September 15, 12
  13. Saturday, September 15, 12

  14. Forgotten approach to concurrency? Saturday, September 15, 12

  15. Example Saturday, September 15, 12

  16. 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
  17. 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
  18. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> Saturday, September 15, 12

  19. Synchronous Calls Saturday, September 15, 12

  20. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch Saturday, September

    15, 12
  21. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch 3... Saturday,

    September 15, 12
  22. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch 3... 2...

    Saturday, September 15, 12
  23. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch 3... 2...

    1... Saturday, September 15, 12
  24. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.launch 3... 2...

    1... BLASTOFF! => nil >> Saturday, September 15, 12
  25. &DOOHU &HOOXORLG $FWRU3UR[\ &$// 5HFHLYHU &HOOXORLG 0DLOER[ 5(63216( &HOOXORLG 0DLOER[

    &HOOXORLG$FWRU &HOOXORLG&DOO &HOOXORLG5HVSRQVH Synchronous Calls Saturday, September 15, 12
  26. Asynchronous Calls Saturday, September 15, 12

  27. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch Saturday, September

    15, 12
  28. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch New syntax!

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

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

    12
  31. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch Saturday, September

    15, 12
  32. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil

    >> Returns immediately Saturday, September 15, 12
  33. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil

    >> 3... Saturday, September 15, 12
  34. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil

    >> 3... 2... Saturday, September 15, 12
  35. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil

    >> 3... 2... 1... Saturday, September 15, 12
  36. >> launcher = Launcher.new => #<Celluloid::Actor(Launcher:0x3fe8bef4d544)> >> launcher.async.launch => nil

    >> 3... 2... 1... BLASTOFF! Saturday, September 15, 12
  37. Asynchronous Calls &DOOHU &HOOXORLG $V\QF3UR[\ &$// 5HFHLYHU &HOOXORLG 0DLOER[ &HOOXORLG$FWRU

    &HOOXORLG&DOO Saturday, September 15, 12
  38. Futures Saturday, September 15, 12

  39. class FibonacciWorker include Celluloid def fib(n) n < 2 ?

    n : fib(n-1) + fib(n-2) end end Saturday, September 15, 12
  40. >> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)

    => #<Celluloid::Future:0x007ffb9201f0a0> Saturday, September 15, 12
  41. >> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)

    => #<Celluloid::Future:0x007ffb9201f0a0> Returns immediately Saturday, September 15, 12
  42. >> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)

    => #<Celluloid::Future:0x007ffb9201f0a0> >> future.value Saturday, September 15, 12
  43. >> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)

    => #<Celluloid::Future:0x007ffb9201f0a0> >> future.value Blocks until complete Saturday, September 15, 12
  44. >> worker = FibonacciWorker.new => #<Celluloid::Actor(FibonacciWorker:0x3ffdcaed65cc)> >> future = worker.future.fib(40)

    => #<Celluloid::Future:0x007ffb9201f0a0> >> future.value => 102334155 Saturday, September 15, 12
  45. &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
  46. Pools Saturday, September 15, 12

  47. >> pool = FibonacciWorker.pool(size: 16) => #<Celluloid::Pool(FibonacciWorker:0x3ffdcaed65cc)> Saturday, September 15,

    12
  48. >> pool = FibonacciWorker.pool => #<Celluloid::Pool(FibonacciWorker:0x3ffdcaed65cc)> 1 actor per CPU

    (by default) Saturday, September 15, 12
  49. >> pool = FibonacciWorker.pool => #<Celluloid::Pool(FibonacciWorker:0x3ffdcaed65cc)> >> (32...40).map { |n|

    pool.future.fib(n) }.map(&:value) Saturday, September 15, 12
  50. >> 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
  51. 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
  52. Twitter: @bascule @celluloidrb Celluloid: celluloid.io Blog: unlimitednovelty.com Saturday, September 15,

    12