2013-07-10 148 views
1

我對我的Sinatra應用程序做了簡單的測試,當我調用長處理程序時,虛擬請求被阻止。Sinatra與薄,多線程不起作用

bundle exec rackup -s thin 

Is Sinatra multi threaded?,薄應該是一個多線程Web服務器:

get '/test/long' do 
    sleep 10 
    "finished" 
end 

get '/test/dummy' do 
    "dummy" 

end 

我用這個命令啓動我的服務器。那麼我的問題在這裏?

my Gemfile: 
source :rubyforge 
gem 'sinatra',   '1.2.6', :require => 'sinatra/base' 

gem 'geokit',  '1.6.0', :require => 'geokit' 
gem 'json',    '1.5.3' 
gem 'dm-core',   '1.2.0' 
gem 'dm-timestamps',  '1.2.0' 
gem 'dm-migrations',  '1.2.0' 
gem 'dm-mysql-adapter', '1.2.0' 
gem 'rack-cache',  '1.0.1', :require => 'rack/cache' 
gem 'rake',    '10.0.0', :require => nil 
gem 'hashie',   '1.0.0' 
gem 'thin' 
gem 'shotgun' 
gem 'rack-mobile-detect', '0.3.0', :require => 'rack/mobile-detect' 
gem 'aws-ses',      :require => 'aws/ses' 

回答

8

瘦可以是多線程的,但只有當您將其配置爲如此時,默認情況下它是單線程的(均勻)。從answer to the question you linked to

自屈1.3.0,薄型將在線程模式啓動,如果它是由屈(即具有ruby app.rb,但不與thin命令,也不能與rackup)開始。

似乎沒有成爲一個辦法讓rackup通過對薄至通過螺紋選項,所以您需要爲使用thin start --threadedruby my_app.rb獲得線程上薄。

0

這是一個在Rack :: Handler中完成Sinatra的方法。 'run'方法帶有一個block參數,它允許您訪問Thin :: Server對象,並且可以通過它設置所有參數。

require 'thin' 
    require 'rack' 

    class App 
      def initialize() 
       puts 'init' 
    end 

    def call(env) 
      puts 'got it' 
      sleep(60) 
      [ 200, { "Content-Type" => "text/plain" }, ["hello"] ] 
    end 

    end 

    Rack::Handler::Thin.run(App.new, options = {:Host => '0.0.0.0', :Port => 8083}) do |server| 
     puts server.class 
     server.threaded = true 
    end