21
em-synchrony について 201186cuzic

Em synchrony について

Embed Size (px)

DESCRIPTION

EventMachine を使った多重

Citation preview

  • 1. em-synchrony 201186 cuzic
  • 2. 1 cuzic Ruby Nook Simple Touch Android 2.1 e-ink Web 82 Coders At Work #2 Ruby/Rails em-synchrony
  • 3. 2 IO eventmachine event- machine Fiber em- synchronyRuby/Rails em-synchrony
  • 4. 3 WEB IO CPU CPU URL etc IO select(2) Ruby/Rails em-synchrony
  • 5. 4 require open-uri urls = %W[http://localhost:3000/1 http://localhost:3000/2 ] urls.each do |url| Ruby puts "#{url} #{open(url).read}" IO end Ruby require open-uri urls = %W[http://localhost:3000/1 http://localhost:3000/2] threads = urls.map do |url| Thread.start(url) do |url| body = open(url).read puts "#{uri} #{body}" end end threads.each{|t| t.join}Ruby/Rails em-synchrony
  • 6. IO 5IO AsyncHTTPClient URL HTTP IO sockets = (urls) loop do readables, = IO.select sockets readables.each do |s| select(2) = s.read_nonblock 65536 sockets.delete s if s.eof? end end eventmachine break if sockets.empty? end Ruby/Rails em-synchrony
  • 7. 6 eventmachine em-http-request eventmachine HTTP HTTP Fiber em-synchrony Fiber EM::Iterator EM::Synchrony:: Iterator Ruby/Rails em-synchrony
  • 8. eventmachine 7IO Heroku Github EngineYard HTTPSMTPMySQL PostgreSQLMemcachedRedis select(2) IO epoll kqueue IO ret1 = 1 1 do |ret| ret2 = 2ret1 2ret1 do |ret2| end endRuby/Rails em-synchrony
  • 9. 8 sinatra/async require rubygems require sinatra WEB require sinatra/base Sinatra require sinatra/async require eventmachine aget get class Delayed < Sinatra::Base register Sinatra::Async /1 /2 aget "/1" do waitsec = rand * 2 1 2 EM.add_timer waitsec do body {"1"} end end aget "/2" do waitsec = rand * 2 EM.add_timer waitsec do body {"2"} end end endRuby/Rails em-synchrony
  • 10. EventMachine HTTPClient 9 require rubygems require eventmachine require uri urls = %W[http://localhost:3000/1 http://localhost:3000/2] HTTP pending = urls.length EventMachine.run do Client = EM::Protocols::HttpClientclient.callback urls.each do |url| uri = URI(url) client = Client.request(EM.stop_event_loop :host => uri.host, :port => uri.port, :request => uri.path,EM HTTPClient ) client.callback do |response| content = response[:content] puts "#{url} content" basic pending -= 1 EM.stop_event_loop if pending == 0 end endRuby/Rails em-synchrony end
  • 11. em-http-request 10EventMachine require rubygems require eventmachineHTTP require em-http-request urls = %W[http://localhost:3000/1 http://localhost:3000/2] pending = urls.length Basic EventMachine.run do Sock5 Request = EM::HttpRequest urls.each do |url| client = Request.new(url).get client.callback do response = client.response puts "#{url} #{response}" pending -= 1 EM.stop_event_loop if pending == 0 end end endRuby/Rails em-synchrony
  • 12. Fiber 11Fiber f1 = Fiber.new do |i| puts i #=> 1 (coroutine) Fiber.yield 2 5 endFiber.yield arg f2 = Fiber.new do |i| puts 3 #=> 3 j = Fiber.yield 4 puts j #=> 6 7 Fiber#resume end Fiber.yield i = f1.resume 1Fiber#resume arg 1 puts i #=> 2 (self) 2 j = f2.resume i + 1 3 puts j #=> 4 4 i = f1.resume Fiber.yield 5 puts i #=> 5 Fiber#resume 6 j = f2.resume 6 7 puts j #=> 7Ruby/Rails em-synchrony
  • 13. em-http-request Fiber 12httpget require require rubygems eventmachineFiber require require em-http-request fiberEM.run urls = %W[http://localhost:3000/1 http://localhost:3000/2] def httpget url f = Fiber.current client = EM::HttpRequest.new(url).get client.callback do f.resume client end return Fiber.yield end pending = urls.size EM.run do Fiber.new do Fiber urls.each do |url| client = httpget url puts "#{url} #{client.response}" pending -= 1 EM.stop_event_loop if pending == 0 end end.resume endRuby/Rails em-synchrony
  • 14. em-synchrony (1) 13em-synchrony require require rubygems eventmachine EM.synchrony require em-http-request require em-synchrony require em-synchrony/em-http get urls = %W[http://localhost:3000/1 Fiber http://localhost:3000/2] EM.synchrony do urls.each do |url| request = EM::HttpRequest.new(url) res = request.get.response puts "#{url} #{res}" end EM.stop_event_loop end URL Ruby/Rails em-synchrony
  • 15. em-synchrony () 14 URL require require rubygems eventmachine require em-http-request require em-synchrony URL require em-synchrony/em-http Fiber urls = %W[http://localhost:3000/1 http://localhost:3000/2] pending = urls.length EM.synchrony do urls.each do |url| 1000 URL Fiber.new do request = EM::HttpRequest.new(url) response = request.get.response puts "#{url} #{response}" pending -= 1 EM.stop_event_loop if pending == 0 end.resume end endRuby/Rails em-synchrony
  • 16. EM::Iterator 15EM::Iterator require rubygems require eventmachine EventMachine require em-http-request urls = %W[http://localhost:3000/1 eachmapinject http://localhost:3000/2] iter.next concurrency = 2 pending = urls.length iter.return EventMachine.run do EM::Iterator.new(urls, concurrency).each do |url, iter| new client = EM::HTTPRequest.new(url).get client.callback do response = client.response puts "#{url} #{response}" pending -= 1 EM.stop_event_loop if pending == 0 iter.next end end endRuby/Rails em-synchrony
  • 17. EM::Synchrony::Iterator 16EM::Synchrony::Iterator require require rubygems eventmachine Fiber each require em-http-request require em-synchrony require em-synchrony/em-http urls = %W[http://localhost:3000/1 Fiber http://localhost:3000/2] concurrency = 2 EventMachine.synchrony do EM::Synchrony::Iterator.new(urls, concurrency).each do |url, iter| pending Fiber.new do client = EM::HttpRequest.new(url) response = client.get.response puts "#{url} #{response}" iter.next end.resume end EM.stop_event_loop endRuby/Rails em-synchrony
  • 18. em-synchrony 17 redismysqlmongodbmemcached EM::Synchrony::Multi EM::Synchrony::ConnectionPool MySQL EM::Synchrony::TCPSocket TCPSocket setsockopt EM::Synchrony::Thread::ConditionVariable Ruby/Rails em-synchrony
  • 19. 18 Ruby 1.9 Cygwin VMWare VirtualBox VitualBox VMWare Windows Cygwin em-http-request gem install --pre em-http-request --pre 1.0.0.beta4 0.3.0 em-http-request 1.0 em-synchrony em-http-request 0.3 1.0 Ruby/Rails em-synchrony
  • 20. 19 IO (Ruby IOevent machine Event Machine IO em-synchrony Fiber URL Ruby/Rails em-synchrony
  • 21. 20