2012-03-28 3 views
9

Я работаю над потоковой загрузкой (CSV) из Rails 3.2, и я сталкиваюсь с проблемой первоначального запроса страницы, занимающего много времени. Следующий код контроллера показывает мой вопрос:Rails 3.2 streaming

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

С выше, ответ, похоже, как его потоковое (с сервера, чем может поддержать его ... Unicorn, в моем случае). Тем не менее, прежде чем он начнет потоковое вещание, он висит гораздо дольше, чем хотелось бы. Если изменить его к следующему, он начинает гораздо быстрее:

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

Я понимаю, что ответ должен начинаться с первой итерации цикла, но, кажется, большие циклы, вызывая, что начальное время загрузки, чтобы удлинить , Если каждая итерация выводится так, как это происходит, не нужно ли брать такое же количество времени, чтобы начать процесс потоковой передачи, независимо от того, сколько всего будет повторяться итераций?

Спасибо за понимание, которое у вас может быть!

EDIT:

Вот объяснение техники я пытающаяся. Может быть, я искажая или отсутствующий шаг ?: http://facebook.stackoverflow.com/questions/3507594/ruby-on-rails-3-streaming-data-through-rails-to-client/4320399#4320399

EDIT:

Я думаю Rack-кэша может быть причиной моей проблемы ... я могу выключить его для конкретного запроса?

EDIT и РЕШИТЬ:

Я был неправ Rack-кэша. Мне просто нужно было добавить self.response.headers['Last-Modified'] = Time.now.ctime.to_s к моему ответу.

+1

Я не понимаю. Код создает один перечислитель из другого перечислителя и присваивает переменную response_body. Сначала будут выполняться вещи справа (если у вас не будет какой-то волшебной мета-вещи), и займет больше времени, тем больше будет число, которое вы вложили. Вам нужно что-то большее для потоковой передачи, но у меня нет предложения. – froderik

+0

Вы, вероятно, уже проверили http://api.rubyonrails.org/classes/ActionController/Streaming.html – froderik

+0

См. Ссылку, которую я добавил выше для объяснения этой техники. –

ответ

10

Редактированный вопрос оказался точно таким, который мне нужен. Отправьте его здесь в качестве ответа.

Ответ на получение обработчика Rack для потоковой передачи правильно, по-видимому, чтобы добавить Last-Modified заголовок в ответ:

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

Привет, Я делаю те же шаги, что и вы сказали, но данные не транслируются. Я использую Thin server, как включить потоковое вещание? –

+0

Возможно, вы захотите использовать Time.now.httpdate. – dkubb