Domanda

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?

È stato utile?

Soluzione

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

Altri suggerimenti

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top