2012-06-07 12 views
5

Korzystanie z Rails 3.0.7, REE 1.8.7.Wykonaj kod w szynach po wysłaniu odpowiedzi do przeglądarki

Chcę uruchomić kod (w szczególności, Garbage Collection) w Railsach po wysłaniu odpowiedzi do przeglądarki.

Czy istnieje sposób na umieszczenie w Rails/Rack/coś, abym mógł zadzwonić GC.start zaraz po wysłaniu odpowiedzi do przeglądarki ze sterownika?

* Uwaga: Nie jest to sytuacja, w której chcę użyć funkcji delayed_job lub resque. Zdaję sobie sprawę z tych narzędzi i nie są one odpowiednie dla tego przypadku użycia. *

+0

Jestem prawie pewien, że istnieją opcje dostrojenia śmietnika Ruby'ego, które nie wymagają łatania Pasażera. Możesz ponownie napisać pytanie, aby się na tym skupić. W przeciwnym razie po prostu zrobiłbyś to w 'after_filter'. – tadman

+0

Już dostosowujemy GC, ale chcielibyśmy również uruchomić go poza cyklem req/response. – Raphael

+0

Również umieszczenie go w after_filter opóźniłoby odpowiedź dla użytkownika: http://stackoverflow.com/questions/9437315/how-when-the-fter-filter-works-runs – Raphael

Odpowiedz

0

Można to zrobić w Merbie, ale same Railsy nie pozwalają na to. Jeśli potrzebujesz tylko wywołać śmieciarza, po prostu rozpocznij nowy wątek po zakończeniu żądania i zadzwoń do GC. W ten sposób nie opóźnisz odpowiedzi do użytkownika i otrzymasz to, czego chcesz.

Thread.new do 
    GC.start 
end 

Jeśli naprawdę trzeba to zrobić, powinieneś pomyśleć o dwóch rzeczach, tworząc mniej lub obiektów działa na JRuby, który ma znacznie lepszą Garbage Collector bieg.

+0

Czy naiwny znakowanie i zamiatanie GC działa w osobnym wątku? Wygląda na to, że przestrzeń obiektu zmieniałaby się, podczas gdy próbowano identyfikować rzeczy do zebrania. – Raphael

+0

Próbowałem tego i moja przestrzeń obiektu zaczęła rosnąć znacznie szybciej niż normalnie, nie jestem pewien, czy GC Ruby może działać poprawnie w osobnym wątku. – Raphael

Powiązane problemy