1

各リクエストを 30 秒間フリーズする単純な Sinatra ベースのアプリケーションがあります。

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 設定で rubinius 2.0.0-rc1 に puma (2.5.1) Web サーバーをセットアップしました。

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 つ目以降のリクエストは未使用のスレッドを待っています。しかし、リクエストは必然的に実行されるようです。2 番目の要求の処理は、最初の要求が終了した後でのみ開始されます。なんで?

4

2 に答える 2

3

これをどのようにテストしていますか?私のテストでは、すべて同じ URL を指す複数のブラウザー ウィンドウを起動すると、要求が順番に処理されますが、これは、ブラウザーが一度に 1 つの要求しか送信しないためと思われます (私は Chrome を使用していますが、私はしませんでした)。他をチェックしてください)。

サーバー上で異なるURL を開く複数のブラウザー ウィンドウを使用すると、要求が期待どおりに同時に処理されます (Sinatra パラメーターを使用してsplat、 のようなルートでこれを簡単にテストできますget '/*/ do ...)。

curl一度に複数のリクエストを送信するために使用することも、すべてが同じ URL であっても、期待どおりに機能します。

于 2013-08-17T22:57:03.983 に答える