Ruby on rails Rails-从控制器运行rake任务或新线程?
我有一个类(Ruby on rails Rails-从控制器运行rake任务或新线程?,ruby-on-rails,ruby-on-rails-3,multithreading,rake,rake-task,Ruby On Rails,Ruby On Rails 3,Multithreading,Rake,Rake Task,我有一个类(/lib/updater.rb),可以对数据库进行大量更新(调用外部服务器、计算等)。通常,此任务由服务器的cron调用(rake/lib/tasks/launch\u updater.rake,用于启动updater.rb),但我也希望有机会从客户端手动启动它 此时,从客户端,用户可以单击按钮并以以下方式启动: # the controller Thread.new { Updater.start } 这是一个很好的解决方案,还是直接从rake任务启动更好 # somethi
/lib/updater.rb
),可以对数据库进行大量更新(调用外部服务器、计算等)。通常,此任务由服务器的cron调用(rake/lib/tasks/launch\u 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
任务不应该是拦截器(用户应该在应用程序上正常导航,而不必等待任务结束)
哪一个更好?为什么?仔细研究一下我的问题,我发现以下注释:
- 当使用线程时,所使用的CPU与应用程序的CPU相同(即使您有多核服务器,CPU也是相同的)。如果您想使用线程,线程任务不应该“繁重”,否则您可能会遇到CPU问题(应用程序处理缓慢)
- 当您从终端或服务器cron启动Rake任务时,这将占用运行进程较轻的CPU。但是如果你从应用程序开始一项任务,我认为CPU甚至与应用程序一样
- 处理高负载任务的更好解决方案是使用延迟服务,以这种方式,作业任务应占用应用程序CPU以外的另一个CPU,而不会对应用程序的性能造成问题:
system(“bundle exec rake…--trace>>logfile 2>&1&”)的操作,而后台作业不是一个选项。这对我们很有用。我记得我是从一家商店买的。