Sinatraでの応答が「eachable」オブジェクトを返す場合、Sinatraのイベントループは結果を「each」し、HTTP応答としてストリーミング方式で結果を生成します。ただし、Sinatraへの同時リクエストがある場合は、別のリクエストを処理する前に、1つのレスポンスのすべての要素を反復処理します。DBクエリの結果にカーソルがある場合は、同時クエリを処理する前に、すべてのデータが使用可能になるのを待つ必要があることを意味します。
私はasync-sinatragemとhttp://macournoyer.com/blog/2009/06/04/pusher-and-async-with-thin/を見て、これらが私の問題を解決すると思っていましたが、試しましたこの例から:
require 'sinatra/async'
class AsyncTest < Sinatra::Base
register Sinatra::Async
aget '/' do
body "hello async"
end
aget '/delay/:n' do |n|
EM.add_timer(n.to_i) { body { "delayed for #{n} seconds" } }
end
end
リクエストは期待どおりに同時に機能し/delay/5
ません。つまり、3つのリクエストを同時に行うと、Chromeのデバッガーは応答時間を約5、10、15秒と記録します。
セットアップが不足していますか、それともSinatra / Thinにリクエストを同時に処理するように指示する別の方法がありますか?
更新:これには別のレンチがあります(またはおそらく問題を解決します):同時に実行すると正しい動作が行われます(それぞれ2つのリクエストが最大5秒で返されます)。(Apacheベンチマークユーティリティ)を実行すると、合計時間(〜25秒)に対して妥当な値も返されます。FirefoxはChromeと同じ動作を示します。ブラウザはコマンドラインユーティリティと何が違うのですか?curl -i http://localhost:3000/delay/5
ab -c 10 -n 50 http://locahost:3000/delay/5