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

Transcript

161 slides
  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

More Decks by David Copeland

Other Decks in Programming