Вопрос

I need to make some slow operations on controller action. But it's not necessary to wait this operation for response rendering.

class ProductController < ActionController
  def update
    slow_operations()
    render json: {status: 'ok'}
  end
end

Even I move my code after render in Product#update action, it's not reduces response time.

class ProductController < ActionController
  def update
    render json: {status: 'ok'}
    slow_operations()
  end
end

How to force to return complete response before executing of slow operations?

Это было полезно?

Решение

Because of the way Rails works, it's still going to do the actual "rendering" after the action is complete - so, as you found out, moving "render" higher in your action doesn't help. What you need to do is shuffle off the long-running operation into a background process. There's lots of gems to do this, including BackgroundRb, Delayed Job and Sidekiq (my personal favourite, largely because it is multi-threaded, cutting down on the number of processes you need to start, and because of its nice web-based admin/monitoring interface).

There's even a Railscast to get you started for most of these, like this one: http://railscasts.com/episodes/366-sidekiq

Другие советы

You need to integrate something like Resque or Girl Friday to offload the slow process to a background task.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top