実行時間の長いルートが 1 つある単純な 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
並行して呼び出すことができます。ただし、同じルートの並列呼び出しは機能しません。この場合、Web サーバーである 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 でアプリを実行しようとしましたが、同じ動作でした