Тонкий веб-сервер по умолчанию пронизан при запуске так, как вы его описали.
# thin_test.rb
require 'sinatra/base'
class Front < Sinatra::Base
configure do
set :server, :thin
end
get '/' do
'Hello, world!'
end
get '/foo' do
sleep 30
'bar'
end
end
Front.start!
Начните с:
ruby thin_test.rb
Подтвердите с помощью:
# will hang for 30 seconds while sleeping
curl localhost:4567/foo
# will complete successfully while the other request is pending
curl localhost:4567
Hello, world!
В этом ответе есть дополнительная информация о том, как Sinatra использует другие веб-серверы.
Если по какой-то причине это не сработает, возможно, будет возможно что-то взломать с помощью опции server_settings
, которая, как правило, полезна только для WEBrick, если вы не используете недокументированные способы ее форсирования:
require 'sinatra/base'
require 'thin'
class ThreadedThinBackend < ::Thin::Backends::TcpServer
def initialize(host, port, options)
super(host, port)
@threaded = true
end
end
class Front < Sinatra::Base
configure do
set :server, :thin
class << settings
def server_settings
{ :backend => ThreadedThinBackend }
end
end
end
get '/' do
'Hello, world!'
end
get '/foo' do
sleep 30
'foobar'
end
end
Front.start!
Мне трудно сказать, является ли этот пример причиной его многопоточности, потому что он запускается в многопоточном режиме по умолчанию. Тем не менее, он не вызывает исключение и работает в многопоточном режиме:
# will hang for 30 seconds while sleeping
curl localhost:4567/foo
# will complete successfully while the other request is pending
curl localhost:4567
Hello, world!
Более подробную информацию о server_settings
можно найти здесь , здесь и здесь .