У меня есть простое приложение 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 с тем же поведением.