EventMachine でいくつかのジョブをバックグラウンド化する可能性を検討しています。Sinatra ではこれはうまく機能しているように見えますが、Rails 3 はビューをレンダリングする前にすべてのティックを実行しているようです。
シン Web サーバーで次のコードを実行すると、期待どおりに動作します。最初のリクエストはすぐに返され、2 番目のリクエストは 3 秒間のスリープ コールが終了するのを待っています。これは予期される動作です。
class EMSinatra < Sinatra::Base
get "/" do
EM.next_tick { sleep 3 }
"Hello"
end
end
一方、Rails 3の実行中は同じことをしようとしています:(シンの下で実行)
class EmController < ApplicationController
def index
EM.next_tick {
sleep(3)
}
end
end
Rails では、ブラウザにビューをレンダリングする前に sleep 呼び出しが発生します。その結果、最初のページがレンダリングされるまで 3 秒間待機しています。
なぜこれが起こっているのか誰にも分かりますか?これが良い習慣であるかどうかについてのコメントは求めていません。私は単に実験しています。小さなタスクをリアクター ループに投入することは、興味深い調査のように思えます。ノンブロッキングの http リクエストを行う場合、なぜクライアントを待たなければならないのでしょうか?