Ruby on Rails:如何在后台运行东西?

Ste*_*fan 30 ruby ruby-on-rails background-process

当创建一个新的资源,它需要做一些冗长的处理前的资源准备好了,我怎么发送处理掉到背景的地方也不会撑起当前请求或其他流量到我的web应用程序?

在我的模型中:

class User < ActiveRecord::Base
 after_save :background_check

 protected
 def background_check
  # check through a list of 10000000000001 mil different
  # databases that takes approx one hour :)
  if( check_for_record_in_www( self.username ) )
    # code that is run after the 1 hour process is finished.
    user.update_attribute( :has_record )
  end
 end
end
Run Code Online (Sandbox Code Playgroud)

ujh*_*ujh 40

你一定要查看以下Railscast:

他们解释了如何以各种可能的方式在Rails中运行后台进程(有或没有队列......)

  • 目前,最常用/最受支持的选项是[sidekiq](https://github.com/mperham/sidekiq),[resque](https://github.com/defunkt/resque)和[delayed_job] ](https://github.com/collectiveidea/delayed_job).恕我直言,Sidekiq是高吞吐量队列的最佳选择,而delayed_job是非常低吞吐量的最佳选择. (2认同)

Cur*_*son 7

启动一个单独的过程,这可能是最容易完成的system,在"nohup"前加上一个'&'并在你传递它的命令的末尾附加'&'.(确保该命令只是一个字符串参数,而不是参数列表.)

您希望以这种方式执行此操作有几个原因,而不是尝试使用线程:

  1. 在执行I/O时,Ruby的线程可能有点棘手; 你必须注意你做的一些事情不会导致整个过程被阻止.

  2. 如果你用不同的名称运行一个程序,它在"PS"易于识别,这样你就不会意外地认为这是一个FastCGI的后端狂野或东西,把它杀了.

实际上,你开始的过程应该是"deamonized",请参阅Daemonize类寻求帮助.


Suj*_*chi 7

我刚刚尝试了'delayed_job'宝石,因为它可以与Heroku托管平台一起使用,设置起来非常简单!

添加宝石的Gemfile, ,,bundle install 然后开始一个队列处理程序;rails g delayed_jobrake db:migrate

RAILS_ENV=production script/delayed_job start
Run Code Online (Sandbox Code Playgroud)

你有一个方法调用,这是你漫长的过程,即

company.send_mail_to_all_users
Run Code Online (Sandbox Code Playgroud)

你把它改成了;

company.delay.send_mail_to_all_users
Run Code Online (Sandbox Code Playgroud)

检查github上的完整文档:https://github.com/collectiveidea/delayed_job