Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-从控制器运行rake任务或新线程?_Ruby On Rails_Ruby On Rails 3_Multithreading_Rake_Rake Task - Fatal编程技术网

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,而不会对应用程序的性能造成问题:

您可以使用延迟作业gem来完成。看看这个+1@Arun Thank是个不错的选择,但是你觉得我的2个解决方案怎么样?嗯,线程不是个好主意。把它作为背景工作最符合你的要求。在控制器中调用rake任务是一种不好的做法。我们在控制器中执行了类似(伪代码)
system(“bundle exec rake…--trace>>logfile 2>&1&”)的操作,而后台作业不是一个选项。这对我们很有用。我记得我是从一家商店买的。