Как разрешить одновременный доступ к одному и тому же маршруту?

У меня есть простое приложение Sinatra с одним длинным маршрутом:

get '/jobs/new' do
  logger.info "jobs/new start. Thread = #{Thread.current.inspect}"
  sleep 10
  logger.info "end new..."
  erb :'jobs/new'
end

get '/jobs' do
  erb :'jobs/index'
end

У меня есть одновременный доступ между маршрутами, но не к одному и тому же маршруту.

Например, пока клиент вызывает /jobs/new (длительно во время доступа), другой клиент может параллельно вызывать jobs. Но параллельный вызов по тому же маршруту не работает. В этом случае веб-сервер Puma всегда вызывает маршрут с одним и тем же потоком:

jobs/new started. Thread = #<Thread:0x007f42b128e600 run>
10 seconds later...
jobs/new ended. Thread = #<Thread:0x007f42b128e600 run>
jobs/new started. Thread = #<Thread:0x007f42b128e600 run> <-- new call. Has to wait till first has finished

Другой маршрут вызывается разными потоками. И пока работает маршрут 1:

jobs/new started. Thread = #<Thread:0x007f42b128e600 run>
2 seconds later...
jobs started. Thread = #<Thread:0x007f541f581a40 run> <--other thread
8 seconds later...
jobs/new ended. Thread = #<Thread:0x007f42b128e600 run>
jobs/new started. Thread = #<Thread:0x007f42b128e600 run>

Я попытался запустить приложение с Thin в многопоточном режиме и с Puma с тем же поведением.


person chrigu    schedule 12.12.2013    source источник
comment
Нет необходимости и не рекомендуется добавлять ключевые слова в заголовки, если только они не являются частью обычной структуры предложения заголовка. Ключевые слова, такие как Sinatra: не используются при поиске и не помогают ранжировать вопрос по ключевым словам. Вместо этого они снижают читабельность заголовка. Ключевые слова и поиски происходят на основе тегов, которые вы добавляете к вопросу.   -  person the Tin Man    schedule 12.12.2013


Ответы (1)


Что бы ты ни сделал, я думаю, что это было неправильно.

Запуск этого кода:

# config.ru
require 'bundler'
Bundler.require

get '/jobs/new' do
  logger.info "jobs/new start. Thread = #{Thread.current.inspect}"
  sleep 10
  logger.info "end new..."
  "jobs/new"
end

run Sinatra::Application

с пумой:

Puma starting in single mode...
* Version 2.7.1, codename: Earl of Sandwich Partition
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:9292
Use Ctrl-C to stop
I, [2013-12-12T14:04:48.820907 #9686]  INFO -- : jobs/new start. Thread = #<Thread:0x007fa5667eb7c0 run>
I, [2013-12-12T14:04:50.282718 #9686]  INFO -- : jobs/new start. Thread = #<Thread:0x007fa566731e38 run>
I, [2013-12-12T14:04:58.821509 #9686]  INFO -- : end new...
127.0.0.1 - - [12/Dec/2013 14:04:58] "GET /jobs/new HTTP/1.1" 200 8 10.0132
I, [2013-12-12T14:05:00.283496 #9686]  INFO -- : end new...
127.0.0.1 - - [12/Dec/2013 14:05:00] "GET /jobs/new HTTP/1.1" 200 8 10.0015
^C- Gracefully stopping, waiting for requests to finish
- Goodbye

Результаты в 2-х разных темах!

person phoet    schedule 12.12.2013
comment
Да, действительно, когда я вызываю маршрут из разных браузеров (FF, Chrome), вызовы выполняются одновременно. Когда я вызываю его из того же браузера (разные вкладки), поведение похоже на мой пример в вопросе. Почему?? - person chrigu; 12.12.2013
comment
Кажется, что браузер не позволяет одновременно вызывать один и тот же URL-адрес. - person chrigu; 13.12.2013
comment
не используйте браузер при отладке таких проблем. полагайтесь на строку cmd, используйте wget или curl - person phoet; 13.12.2013