如何在Rails 3.1中渲染后执行某些任务

时间:2011-11-17 12:51:19

标签: ruby-on-rails ruby-on-rails-3.1 rendering fork

我正在使用Impressionist来记录网页展示次数。数据库写入只需要大约50毫秒,但我真的更喜欢在页面呈现并发送到客户端后执行此操作。

我通过Spawn查看了分叉,但它建立了一个新的数据库连接,这对于这么小的工作来说似乎有点过分。延迟作业和其他后台处理库看起来像主要过度杀伤。写入数据库只是为了推迟写入数据库......而不是赢。

我希望我可以:

def show
  render
  impressionist(@article)
end

...并且让印象派用相同的数据库连接和所有与操作相同的请求数据来执行其操作,就在操作已经返回到客户端之后。但当然,这不是渲染方法的工作原理。

任何解决方案?在Heroku Cedar上运行Rails 3.1和Ruby 1.9.2。

6 个答案:

答案 0 :(得分:6)

产生一个新线程。 Heroku将允许每个dyno最多15个线程。

def show
  render
  Thread.new do
    impressionist(@article)
  end
end

答案 1 :(得分:1)

有一个非常酷的railscast使用Resque就是这样,但我很确定它也涉及分叉,就像我见过的所有其他方法一样。

答案 2 :(得分:1)

这出现并看起来很有希望:https://github.com/brandonhilkert/sucker_punch

布兰登是一个坚定的家伙。我等不及尝试Sucker Punch了!

答案 3 :(得分:1)

就个人而言,我不建议从操作中启动“Thread new”,然后将后台线程引用传递给仍然在另一个线程中操作的元素。由于线程之间的冲突,这样会很快导致令人讨厌的不可重现的错误。

答案 4 :(得分:0)

如同使用mongodb更快地记录某些内容,或者您​​可以考虑以redis(超快)存储哈希值,并且每隔一小时左右运行批处理作业以将这些存储在postgres数据库中。使用这两个选项,您将不得不破解印象派,或者推出自己的解决方案,正如您在背景解决方案(delayed_job,resque等)中所建议的那样,根据项目的大小,这可能是过度的。

答案 5 :(得分:0)

我认为您可以使用after_filter回调函数

class ApplicationController < ActionController::Base

  after_filter :after_filter_cb

  def after_filter_cb
    # Some logic
  end

end