2012-06-07 7 views
5

Rails 3.0.7、REE 1.8.7を使用。レスポンスがブラウザに送信された後にコードをレールに実行

レスポンスがブラウザに送信された後に、Railsでコード(特にガベージコレクション)を実行したいとします。

レスポンスがコントローラからブラウザに送信された直後にGC.startを呼び出せるようにRails/Rack /何かにパッチを当てる方法はありますか?

注:これは、delayed_jobまたはresqueを使用する状況ではありません。私はこれらのツールを既に認識しており、このユースケースには適切ではありません。*

+0

Rubyのガベージコレクタをチューニングして、乗客にパッチを当てる必要がないオプションがあることは間違いありません。それに焦点を当てて質問を書き直したいかもしれません。さもなければ、 'after_filter'でそれを行うだけです。 – tadman

+0

私たちはすでにGCをチューニングしていますが、req/responseサイクルの外でもGCを実行したいと考えています。 – Raphael

+0

また、after_filterに入れると、ユーザーへの応答が遅くなります。http://stackoverflow.com/questions/9437315/how-when-the-after-filter-works-runs – Raphael

答えて

0

Merbではこれを行うことができますが、Rails自体ではできません。要求が完了したらGCを呼び出すだけでガベージコレクタを呼び出すだけで新しいスレッドを開始できます。この方法では、ユーザーへの応答を遅らせず、必要なものを手に入れません。あなたが本当にこれを実行する必要がある場合は

Thread.new do 
    GC.start 
end 

は、おそらくあまりオブジェクトを作成したり、より良いガベージコレクタを実行しているJRubyの上で実行して、約2物事を考える必要があります。

+0

素朴なマークアンドスイープGCは別のスレッドで動作できますか?オブジェクト空間がコレクションのために物を識別しようとしている間に変化しているようです。 – Raphael

+0

これを試してみましたが、私のオブジェクト空間は通常よりもはるかに速く成長し始めました。RubyのGCが別スレッドで正常に動作するかどうかは不明です。 – Raphael

関連する問題