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 (2.5.1) на rubinius 2.0.0-rc1 со следующей конфигурацией 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-й и последующие запросы будут ожидать неиспользуемого потока. Но оказалось, что запросы выполняются последовательно. Обработка второго запроса начинается только после завершения первого запроса. Почему?


person user2691605    schedule 17.08.2013    source источник


Ответы (2)


Как вы это тестируете? В моем тестировании запуск нескольких окон браузера, указывающих на один и тот же URL-адрес, приводит к тому, что запросы обрабатываются последовательно, но, похоже, это связано с тем, что браузер отправляет только один запрос за раз (я используя Chrome, я не проверял другие).

Наличие нескольких окон браузера, открывающих разные URL-адреса на сервере, приводит к тому, что запросы обрабатываются одновременно, как и ожидалось (вы можете использовать параметр Sinatra splat, чтобы легко проверить это, с таким маршрутом, как get '/*/ do ...).

Использование curl для одновременной отправки нескольких запросов, даже на один и тот же URL-адрес, также работает, как и ожидалось.

person matt    schedule 17.08.2013
comment
Ты прав! Я никогда не думал, что браузер будет вести себя так! Любые идеи, почему это происходит? - person user2691605; 18.08.2013

Весьма вероятно, что Sinatra нужно запускать с ruby app.rb, а не с rackup, или с командой, специфичной для сервера, для запуска приложения в соответствии с подходом автоматической настройки Sinatra. Или вам нужно углубиться в настройку Sinatra, а не только Puma

См. самые последние строки ответа Константина: Является ли Sinatra многопоточным?

... В противном случае это проблема с Puma, которой я видел подобные, что заставило меня перейти на Reel, а затем полностью отказаться от Rack и Sinatra.

person digitalextremist    schedule 17.08.2013
comment
попытался запустить «ruby app.rb -s Puma -o x.x.x.x -p 9292» такая же ситуация. - person user2691605; 18.08.2013