2013-12-12 4 views
0

У меня есть простое приложение Синатры с один длинный Продолжительность маршрута:Как разрешить одновременный доступ к тому же маршруту?

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, с таким же поведением

+0

Это не обязательно, и не рекомендуется добавлять ключевые слова в заголовки, если они не являются частью нормальной структуры предложения заголовка. Ключевые слова, такие как «Синатра:», не используются поисками, а также не помогают ключевому ракурсу вопроса. Вместо этого они уменьшают читаемость заголовка. Ключевые слова и поисковые запросы происходят на основе тегов, которые вы добавляете к вопросу. –

ответ

0

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

Выполнение этого кода:

# 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 разных потоков!

+0

Да, действительно, когда я вызываю маршрут из разных браузеров (FF, chrome), вызовы являются параллельными. Когда я вызываю его из одного браузера (разные вкладки), поведение похоже на мой пример в вопросе. Зачем?? – chrigu

+0

Кажется, что браузер предотвращает одновременный вызов одного и того же URL-адреса. – chrigu

+0

не используют браузер при отладке таких проблем. полагайтесь на строку cmd, используйте 'wget' или' curl' – phoet

Смежные вопросы