Как настроить Тонкий веб-сервер от Синатры? - PullRequest
0 голосов
/ 30 октября 2018

Это мое веб-приложение:

class Front < Sinatra::Base
  configure do
    set :server, :thin
  end
  get '/' do
    'Hello, world!'
  end 
end

Я начинаю это так:

Front.start!

Прекрасно работает, но я хочу настроить Thin для работы с нитями. Я знаю, что это возможно, согласно их документации . Но я не могу понять, как передать этот параметр threaded: true в Thin. Я попробовал это, и это не работает:

configure do
  set :server_settings, threaded: true
end

1 Ответ

0 голосов
/ 30 октября 2018

Тонкий веб-сервер по умолчанию пронизан при запуске так, как вы его описали.

# 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 можно найти здесь , здесь и здесь .

...