4

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/5ab -c 10 -n 50 http://locahost:3000/delay/5

4

2 に答える 2

4

EM.defer結局、この例は実際に機能し、最終的には、主にPusherとAsyncページのアイデアを使用して、Sinatraにそれぞれの可能な結果を​​同時にストリーミングさせることができることがわかりました。curlとApacheのベンチマークにより、これが機能していることが確認されました。

ブラウザで機能しなかった理由は、ブラウザが同じURLへの接続数を制限しているためです。単一のドメインへの同時接続には制限があることを認識していましたが(これも少数です)、(一見)単一のURIへのすべての接続がシリアル化されているわけではありません。

http://maillist.caucho.com/pipermail/resin-interest/2009-August/003998.html

これが構成可能かどうかはわかりません。Firefoxではドメイン全体の構成しか表示されませんが、それが問題でした。

于 2010-11-10T16:08:36.657 に答える
-1

オブジェクトの応答を処理しようとしているときは、次のようにします。

fork do
  handle request...
  exit 99
end

そして、この子プロセスが終了するのを待つ必要がない場合は、次のようにします。

child = fork do
  handle request...
  exit 99
end

Process.detach(child)

これは複数のリクエストを処理する簡単な方法ですが、これらのDBクエリに使用しているORMはわかりませんが、データベースにアクセスしようとする複数のプロセスでテーブル/行レベルのロックの問題が発生する可能性があります。リクエストの処理と言うときは...

于 2010-10-16T05:41:26.517 に答える