Rails - 从控制器运行rake任务或新线程?

时间:2013-08-29 10:11:13

标签: ruby-on-rails ruby-on-rails-3 multithreading rake rake-task

我有一个类(/lib/updater.rb)来对数据库进行大量更新(调用外部服务器,计算......)。通常,此任务由服务器的cron(rake /lib/tasks/launch_updater.rake启动updater.rb)调用,但我也希望有机会从客户端手动启动它。

此时,用户可以从客户端单击按钮并以这种方式启动它:

# the controller
Thread.new {
  Updater.start
}

这是一个很好的解决方案,还是最好直接从rake任务启动?

# something like this from the controller
Rake::Task[params[:task]].reenable 
Rake::Task[params[:task]].invoke

任务应该是无阻塞的(用户应该在应用程序上正常导航而不等待任务结束)。

哪个更好,为什么?

1 个答案:

答案 0 :(得分:0)

在我的问题上做了一点我发现了以下注意事项:

  • 使用线程时,在应用程序的CPU上使用的CPU是相同的(即使你有一个多核服务器,CPU也是一样的)。如果你想使用Thread,Thread任务不应该“重”,否则你可能会遇到CPU问题(应用程序处理速度慢)。
  • 当您从终端或服务器cron启动Rake任务时,这应该使CPU运行较轻的进程。但是如果你从应用程序启动一个任务,我认为CPU就像应用程序一样。
  • 使用延迟服务的更好解决方案是使用延迟服务,这样作业任务应该占用比应用程序CPU更多的CPU,而不会对应用程序的性能造成问题: