我有简单的基于Sinatra的应用程序,冻结每个请求30秒:
get '/test' do
puts "#{@@counter}, #{Thread.current.object_id}"
1.upto(30) {|i| sleep 1;puts "#{Thread.current.object_id}, #{i}"}
[200, "#{Thread.current.object_id}, #{@@counter += 1}"]
end
我在rubinius 2.0.0-rc1上设置了puma(2.5.1)web服务器,其中包含以下puma配置:
pidfile "#{app_path}/pid_files/puma.pid"
state_path "#{app_path}/pid_files/puma.state"
environment 'production'
threads 3, 3
bind "tcp://x.x.x.x:9292"
daemonize true
我原以为这个配置能够同时处理3个请求,而第4个和后续请求将等待未使用的线程。 但似乎请求是相应的。仅在第一个请求完成后才开始处理第二个请求。为什么呢?
答案 0 :(得分:3)
你是如何测试的?在我的测试启动多个浏览器窗口时,所有指向同一个url会导致请求按顺序处理,但这似乎是因为浏览器一次只发送一个请求(我是使用Chrome,我没有检查任何其他内容。)
让多个浏览器窗口在服务器上打开不同的网址会导致请求按预期同时处理(您可以使用Sinatra splat
参数轻松地对此进行测试,并使用类似的路径get '/*/ do ...
)。
使用curl
一次发送多个请求,即使是同一个网址,也可以按预期工作。
答案 1 :(得分:1)
根据Sinatra的自动配置方法,很可能Sinatra
需要使用ruby app.rb
而不是rackup
或服务器特定的命令来启动应用程序。或者您需要深入了解Sinatra
配置,而不仅仅是Puma
请参阅Konstantin答案的最后几行:Is Sinatra multi threaded?
...否则这是Puma
我遇到的问题,导致我转移到Reel
然后远离Rack
和{{1}完全。