Sinatra薄,多线程不起作用

时间:2013-07-10 12:09:04

标签: ruby multithreading sinatra thin

我在我的Sinatra应用程序上做了一个简单的测试,当我调用long处理程序时,虚拟请求被阻止。

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

 get '/test/dummy' do
    "dummy"

 end

我使用此命令启动了我的服务器:

bundle exec rackup -s thin

根据Is Sinatra multi threaded?,Thin应该是一个多线程Web服务器。那我的问题是什么?

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'

2 个答案:

答案 0 :(得分:9)

Thin可以是多线程的,但只有在将其配置为如此时,默认情况下它才是单线程(evented)。来自answer to the question you linked to

  

自Sinatra 1.3.0起,Thin将以线程模式启动,如果它由Sinatra启动(即使用ruby app.rb,但不是thin命令启动,也不启动rackup )。

似乎没有办法让rackup将线程选项传递给Thin,因此您需要使用thin start --threadedruby my_app.rb来获取线程薄。

答案 1 :(得分:0)

这是在Rack :: Handler中使用Sinatra执行此操作的方法。 'run'方法采用一个块参数,它允许您访问Thin :: Server对象,并且可以通过它设置所有参数。

{{1}}