1

我有一个简单的基于 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 

我使用以下 puma 配置在 rubinius 2.0.0-rc1 上设置了 puma (2.5.1) Web 服务器:

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 个和后续请求将等待未使用的线程。但似乎请求是按顺序运行的。只有在第一个请求完成后才开始处理第二个请求。为什么?

4

2 回答 2

3

你如何测试这个?在我的测试中,启动多个浏览器窗口都指向同一个 url 会导致请求按顺序处理,但这似乎是因为浏览器一次只发送一个请求(我使用的是 Chrome,我没有检查任何其他)。

让多个浏览器窗口在服务器上打开不同的 url 会导致请求按预期同时处理(您可以使用 Sinatrasplat参数轻松测试这一点,使用类似的路由get '/*/ do ...)。

使用curl一次发送多个请求,即使所有请求都发送到同一个 url,也可以按预期工作。

于 2013-08-17T22:57:03.983 回答
1

根据 Sinatra 的自动配置方法,很可能Sinatra需要使用ruby app.rb而不是rackup特定于服务器的命令来运行应用程序来启动应用程序。或者您需要更深入地了解Sinatra配置,而不仅仅是Puma

请参阅康斯坦丁回答的最后几行:Sinatra 是多线程的吗?

...否则这是一个Puma我见过的问题,这导致我移动到然后Reel完全离开。RackSinatra

于 2013-08-17T14:47:24.440 回答