ruby - Rubinius + Puma 不会同时处理请求

标签 ruby multithreading sinatra rubinius puma

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

最佳答案

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

让多个浏览器窗口在服务器上打开不同 url 会导致请求按预期同时处理(您可以使用 Sinatra splat 参数轻松测试它,使用像 get '/*/do ... 这样的路线。

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

关于ruby - Rubinius + Puma 不会同时处理请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287167/

相关文章:

ruby - 重启 Sidekiq

ruby-on-rails - 遍历数组,调整虚拟属性并返回具有调整值的数组

javascript - 返回当前位置 x 英里半径内的地点列表

ruby-on-rails - 为什么设计不在登录页面上显示身份验证错误?

multithreading - 通过transational REST api在neo4j cypher中写锁行为

ruby - 无法启动 sinatra 应用程序

Ruby 确定季节(秋季、冬季、 Spring 或夏季)

c++ - ARM Linux 中的队列库

c# - 两个或多个线程可以毫无问题地迭代同一个 List<t> 吗?

ruby - 如何使用 Sinatra 和 DataMapper 解析 json 并将该数据写入数据库