2012-03-28 34 views
9

Tôi đang làm việc trên một tải xuống trực tuyến (CSV) từ Rails 3.2 và sáng lên chống lại một vấn đề của yêu cầu trang ban đầu mất một thời gian dài. Mã điều khiển sau đây minh họa sự cố của tôi:Rails 3.2 streaming

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

Với câu trả lời trên, dường như luồng của nó (từ máy chủ có thể hỗ trợ nó ... Unicorn, trong trường hợp của tôi). Điều đó nói rằng, trước khi nó bắt đầu phát trực tuyến nó treo trong một thời gian lâu hơn tôi muốn. Nếu tôi thay đổi nó để sau, nó bắt đầu nhanh hơn nhiều:

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

sự hiểu biết của tôi là phản ứng nên bắt đầu với phiên đầu tiên của vòng lặp, nhưng có vẻ như các vòng lớn đang gây ra rằng thời gian tải ban đầu để kéo dài . Nếu mỗi lần lặp lại là đầu ra khi nó xảy ra, không nên mất cùng một lượng thời gian để khởi động quá trình phát trực tuyến, bất kể tổng số lần lặp lại sẽ là bao nhiêu ???

Cảm ơn mọi thông tin chi tiết bạn có thể có!

EDIT:

Đây là giải thích về kỹ thuật tôi đang cố gắng. Có lẽ tôi đang hiểu sai hoặc thiếu một bước ?: http://facebook.stackoverflow.com/questions/3507594/ruby-on-rails-3-streaming-data-through-rails-to-client/4320399#4320399

EDIT:

tôi nghĩ rack-Cache có thể gây ra vấn đề của tôi ... Tôi có thể tắt nó đi cho một yêu cầu cá nhân?

CHỈNH SỬA và GIẢI QUYẾT:

Tôi đã sai về Rack-Cache. tôi chỉ cần thêm self.response.headers['Last-Modified'] = Time.now.ctime.to_s vào phản hồi của tôi.

+1

Tôi không nhận được nó. Mã tạo ra một điều tra viên từ một điều tra viên khác và gán biến response_body. Các công cụ bên phải sẽ được thực thi đầu tiên (trừ khi bạn có một số công cụ meta kỳ diệu đang diễn ra) và sẽ mất nhiều thời gian hơn số lượng bạn đặt vào. Bạn cần thêm thứ gì đó để phát trực tuyến nhưng tôi không có đề xuất nào. – froderik

+0

Bạn có thể đã xem http://api.rubyonrails.org/classes/ActionController/Streaming.html – froderik

+0

Xem liên kết tôi đã thêm ở trên để biết giải thích về kỹ thuật. –

Trả lời

10

Câu hỏi được chỉnh sửa hóa ra có chứa chính xác câu trả lời tôi cần. Đăng nó ở đây như một câu trả lời.

Câu trả lời cho việc xử lý Kệ để dòng đúng là dường như để thêm một tiêu đề Last-Modified để phản ứng:

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

Xin chào, tôi thực hiện các bước tương tự như bạn đã nói, nhưng dữ liệu không được truyền trực tuyến. Tôi đang sử dụng máy chủ Thin, làm cách nào để có thể bật phát trực tuyến? –

+0

Bạn có thể muốn sử dụng Time.now.httpdate thay thế. – dkubb

Các vấn đề liên quan