2012-03-28 48 views
9

我正在從Rails 3.2處理流式下載(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。我只需要在我的回覆中添加self.response.headers['Last-Modified'] = Time.now.ctime.to_s

+1

我不明白這一點。該代碼從另一個枚舉器創建一個枚舉器並分配response_body變量。右邊的東西將首先被執行(除非你有一些魔術元素正在進行),並且放入的數字越大,需要的時間就越長。您需要更多的東西來做流式處理,但我自己並沒有任何建議。 – froderik 2012-03-29 13:32:56

+0

您可能已經檢出了http://api.rubyonrails.org/classes/ActionController/Streaming.html – froderik 2012-03-29 13:34:47

+0

請參閱我在上面添加的關於該技術的解釋的鏈接。 – 2012-03-29 15:45:30

回答

10

編輯後的問題竟然包含我需要的答案。在這裏發帖作爲回答

答案得到架操縱正常流顯然是一個Last-Modified頭添加到響應:

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

嗨,我按照你說的做了同樣的步驟,但數據沒有流式傳輸。我正在使用Thin服務器,如何啓用流式傳輸? – 2012-11-11 03:57:09

+0

您可能想使用Time.now.httpdate代替。 – dkubb 2013-10-01 17:00:34