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

Don't Fear the Threads: Simplify Your Life with...

Don't Fear the Threads: Simplify Your Life with JRuby

Slides form my talk at RubyNation 2012

David Copeland

March 23, 2012
Tweet

More Decks by David Copeland

Other Decks in Programming

Transcript

  1. don’t fear the threads simplify your life with JRuby [email protected]

    @davetron5000 www.naildrivin5.com www.awesomecommandlineapps.com 1
  2. 5

  3. 7

  4. 17

  5. 20

  6. 25

  7. require 'em-http' include EM::HttpRequest EM.run { # some of your

    code that does IO some_callback { |results_of_io| # the rest of your code that # uses the results } } 25
  8. require 'em-http' include EM::HttpRequest EM.run { # some of your

    code that does IO some_callback { |results_of_io| # the rest of your code that # uses the results } } 25
  9. 27

  10. require 'em-http' include EM::HttpRequest EM.run { # some of your

    code that does SOME of your I/O some_callback { |results_of_io| # use the results # now some more code that does some MORE I/O some_other_callback { |results_of_more_io| # use the results of THIS I/O } } } 27
  11. 28

  12. require 'em-http' include EM::HttpRequest EM.run { # some of your

    code that does SOME of your I/O some_callback { |results_of_io| # use the results # now some more code that does some MORE I/O some_other_callback { |results_of_more_io| # use the results of THIS I/O # SERIOUSLY, more I/O?!??!@ How much do you need? yet_more_callbacks { |moar_resultz| # How many levels deep are we now?! } } } } 28
  13. require 'em-http' include EM::HttpRequest EM.run { # some of your

    code that does SOME of your I/O some_callback { |results_of_io| # use the results # now some more code that does some MORE I/O some_other_callback { |results_of_more_io| # use the results of THIS I/O # SERIOUSLY, more I/O?!??!@ How much do you need? yet_more_callbacks { |moar_resultz| # How many levels deep are we now?! } } } } 28
  14. 39

  15. MRI (aka C Ruby) Thread is an OS thread GIL

    :( I/O will cause a context switch (except in 1.8) 49
  16. JRuby Thread is a JVM Thread (which is an OS

    thread) Context switch for variety of reasons 51
  17. JRuby Thread is a JVM Thread (which is an OS

    thread) Context switch for variety of reasons True parallelism 51
  18. 54

  19. threads = [] threads << Thread.new { # your code

    } threads << Thread.new { # moar code } # etc threads.each(&:join) # All threads have completed exit 0 59
  20. 62

  21. 63

  22. service = Executors.new_fixed_thread_pool(10) tcp_erver = TCPServer.new("127.0.0.1",8080) loop do { s

    = tcp_server.accept service.execute { s.puts calculate_pi() s.close } } 66
  23. service = Executors.new_fixed_thread_pool(10) tcp_server = TCPServer.new("127.0.0.1",8080) Signal.trap('SIGINT') { service.shutdown }

    loop do { s = tcp_server.accept service.execute { s.puts calculate_pi() s.close } break if service.is_shutdown } 67
  24. service = Executors.new_fixed_thread_pool(10) tcp_server = TCPServer.new("127.0.0.1",8080) Signal.trap('SIGINT') { service.shutdown }

    loop do { s = tcp_server.accept service.execute { s.puts calculate_pi() s.close } break if service.is_shutdown } service.await_termination(10,TimeUnit.SECONDS) service.shutdown_now 68
  25. mutex = Mutex.new results = [] Thread.new { mutex.synchronize {

    results << some_result() } } Thread.new { mutex.synchronize { results << other_result() } } 72
  26. Performance Gains with Context Switching Increase in # of Threads

    Speedup Cost of Context Switching Takes Over 85
  27. 100

  28. Echo Server •Listen on a port •Respond to each request

    in a new Thread •Extra Credit: Record stats on requests in a shared data structure 102
  29. Connection Pool •Allow N clients to access X shared instances

    of, say, Redis (where N > X) •Clients “check out” a connection and get exclusive access •Clients “check in” when done •Instances get re-used 103