2012-03-28 17 views
9

Pracuję nad strumieniowym pobieraniem (CSV) z Rails 3.2 i napotykam na problem z początkową prośbą o stronę, która trwa długo. Poniższy kod ilustruje kontroler mój problem:Rails 3.2 streaming

 self.response_body = Enumerator.new do |y| 
     10_000_000.times do 
      y << "Hello World" 
     end 
     end 

z powyższym, odpowiedź wydaje się jak jego streamingu (z serwera niż można go obsługiwać ... Unicorn, w moim przypadku). To powiedziawszy, zanim zacznie streamować, wisi na znacznie dłużej, niż bym chciał. Jeśli zmienię go do dalszej zaczyna znacznie szybciej:

 self.response_body = Enumerator.new do |y| 
     1000.times do 
      y << "Hello World" 
     end 
     end 

Rozumiem, że odpowiedź powinna rozpocząć się w pierwszej iteracji pętli, ale wydaje się większe pętle powodują, że początkowy czas ładowania, aby wydłużyć . Jeśli każda iteracja jest wyprowadzana tak, jak to się dzieje, czy nie powinno to potrwać tyle samo czasu, aby rozpocząć proces przesyłania strumieniowego, niezależnie od tego, ile będzie całkowitych iteracji?

Dzięki za wszelkie informacje, które możesz mieć!

EDIT:

Oto wyjaśnienie techniki Ja próbuje. Może ja źle interpretują lub brakujące krok ?: http://facebook.stackoverflow.com/questions/3507594/ruby-on-rails-3-streaming-data-through-rails-to-client/4320399#4320399

EDIT:

myślę Rack-Cache może być przyczyną mojego problemu ... Mogę go wyłączyć na indywidualne zamówienie?

EDIT i rozwiązany:

myliłem o Rack-cache. Potrzebowałem tylko dodać self.response.headers['Last-Modified'] = Time.now.ctime.to_s do mojej odpowiedzi.

+1

ja nie rozumiem. Kod tworzy jeden moduł wyliczający z innego modułu wyliczającego i przypisuje zmienną response_body. Rzeczy po prawej będą wykonywane najpierw (chyba że masz jakieś magiczne metafory) i potrwają dłużej, im większy numer, który umieścisz. Potrzebujesz czegoś więcej do streamowania, ale sam nie mam sugestii. – froderik

+0

Prawdopodobnie już wyewidencjonowałeś http://api.rubyonrails.org/classes/ActionController/Streaming.html – froderik

+0

Zobacz link dodany powyżej dla wyjaśnienia techniki. –

Odpowiedz

10

Zmienione pytanie okazało się zawierać dokładnie taką odpowiedź, jakiej potrzebowałem. Zamieszczam tutaj jako odpowiedź.

Odpowiedzią na coraz handler Rack prawidłowo strumień jest najwyraźniej dodać Last-Modified nagłówka do odpowiedzi:

self.response.headers['Last-Modified'] = Time.now.ctime.to_s 
+0

Witam, robię te same kroki, co powiedziałeś, ale dane nie są przesyłane strumieniowo. Używam serwera Thin, jak mogę włączyć przesyłanie strumieniowe? –

+0

Prawdopodobnie chcesz zamiast tego użyć Time.now.httpdate. – dkubb