: " IO/ "
http://merbist.com/2011/02/22/concurrency-in-ruby-explained/:
" , Twisted, EventMachine Node.js. Ruby EventMachine
- EventMachine, Thin, EM-/, ".
EventMachine.defer
*
EventMachine.
- , ( "" )
, EventMachine.
, , ( )
EventMachine.
EventMachine , , ( " " )
.
, , . , - .
*
, HTTP- , ,
process Connecction.
$GEM_HOME/gems/thin-1.6.2/lib/thin/connection.rb:
class Connection < EventMachine::Connection
def process
if threaded?
@request.threaded = true
EventMachine.defer(method(:pre_process), method(:post_process))
else
@request.threaded = false
post_process(pre_process)
end
end
.. , EventMachine.defer
, EventMachine
:
, Sinatra ($GEM_HOME/gems/sinatra-1.4.5/base.rb)
Sinatra Thin, Puma, Mongrel WEBrick.
def run!(options = {}, &block)
return if running?
set options
handler = detect_rack_handler
....
detect_rack_handler Rack:: Handler
return Rack::Handler.get(server_name.to_s)
,
def start_server(handler, server_settings, handler_name)
handler.run(self, server_settings) do |server|
....
server.threaded = settings.threaded if server.respond_to? :threaded=
$GEM_HOME/gems/thin-1.6.2/lib/thin/server.rb
def start
raise ArgumentError, 'app required' unless @app
log_info "Thin web server (v#{VERSION::STRING} codename #{VERSION::CODENAME})"
...
log_info "Listening on #{@backend}, CTRL+C to stop"
@backend.start { setup_signals if @setup_signals }
end
$GEM_HOME/gems/thin-1.6.2/lib/thin/backends/base.rb
def start
@stopping = false
starter = proc do
connect
yield if block_given?
@running = true
end
if EventMachine.reactor_running?
starter.call
else
@started_reactor = true
EventMachine.run(&starter)
end
end