Rails 3.2 потоковое - PullRequest
       52

Rails 3.2 потоковое

9 голосов
/ 29 марта 2012

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

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

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

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

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

Спасибо за ваше понимание!

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ и РЕШЕНО:

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

1 Ответ

10 голосов
/ 25 июня 2012

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

Чтобы правильно обработать потоковую передачу, нужно добавить заголовок Last-Modified к ответу:

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