2012-03-28 47 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