3

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

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

 get '/test/dummy' do
    "dummy"

 end

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

bundle exec rackup -s thin

根据Sinatra 是多线程的吗?, 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'
4

2 回答 2

9

Thin 可以是多线程的,但前提是您将其配置为多线程,默认情况下它是单线程的(事件)。从您链接到的问题的答案

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

似乎没有办法rackup将线程选项传递给 Thin,因此您将需要使用其中一个thin start --threadedruby my_app.rb在 Thin 上获取线程。

于 2013-07-10T13:36:34.140 回答
1

这是在没有 Sinatra 的情况下在 Rack::Handler 中执行此操作的方法。'run' 方法采用一个块参数,它使您可以访问 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
于 2018-02-06T17:56:06.643 回答